Python应用程序的最佳项目结构是什么?

Python应用程序的最佳项目结构是什么?,python,directory-structure,organization,project-structure,Python,Directory Structure,Organization,Project Structure,假设您想用Python开发一个不平凡的最终用户桌面(而不是web)应用程序。构建项目文件夹层次结构的最佳方法是什么 理想的特性是易于维护、IDE友好、适用于源代码管理分支/合并以及易于生成安装包 特别是: 你把源头放在哪里 应用程序启动脚本放在哪里 你把IDE项目放在哪里 您将单元/验收测试放在哪里 您将非Python数据(如配置文件)放在哪里 您在PyD/SO二进制扩展模块中使用了诸如C++之类的非Python源? 没什么大不了的。任何让你快乐的事情都会成功。没有太多愚蠢的规则,因为Pytho

假设您想用Python开发一个不平凡的最终用户桌面(而不是web)应用程序。构建项目文件夹层次结构的最佳方法是什么

理想的特性是易于维护、IDE友好、适用于源代码管理分支/合并以及易于生成安装包

特别是:

  • 你把源头放在哪里
  • 应用程序启动脚本放在哪里
  • 你把IDE项目放在哪里
  • 您将单元/验收测试放在哪里
  • 您将非Python数据(如配置文件)放在哪里
  • 您在PyD/SO二进制扩展模块中使用了诸如C++之类的非Python源?
    没什么大不了的。任何让你快乐的事情都会成功。没有太多愚蠢的规则,因为Python项目可以很简单

    • /scripts
      /bin
      用于那种命令行界面的东西
    • /tests
      用于您的测试
    • /lib
      用于您的C语言库
    • /doc
      用于大多数文档
    • Epydoc生成的API文档的
      /apidoc
    顶层目录可以包含自述文件、配置文件等等

    艰难的选择是是否使用
    /src
    树。Python不像Java或C那样在
    /src
    /lib
    /bin
    之间有区别

    由于顶级
    /src
    目录被某些人视为毫无意义,因此顶级目录可以是应用程序的顶级体系结构

    • /foo
    • /bar
    • /baz
    我建议将所有这些放在“我的产品名称”目录下。因此,如果您正在编写一个名为
    qux
    的应用程序,则包含所有这些内容的目录名为
    /qux

    然后,另一个项目的
    PYTHONPATH
    可以包括
    /path/to/qux/foo
    以重用
    qux.foo
    模块


    在我的例子中,因为我使用了Komodo Edit,所以我的IDE cuft是一个.KPF文件。实际上,我把它放在顶级的
    /qux
    目录中,并省略了将其添加到SVN中。

    非python数据最好使用中的
    包数据
    支持捆绑在python模块中。我强烈建议使用名称空间包来创建多个项目可以使用的共享名称空间——很像Java惯例,将包放入
    com.yourcompany.yourproject
    (并且能够拥有一个共享的
    com.yourcompany.utils
    名称空间)

    重新分支和合并,如果您使用足够好的源代码管理系统,它甚至可以通过重命名来处理合并;他特别擅长这个

    与这里的一些其他答案相反,我的+1是拥有
    src
    顶级目录(旁边有
    doc
    test
    目录)。文档目录树的特定约定将因您使用的内容而异,例如,它有自己的quickstart工具支持的约定


    请,请利用setuptools和pkg_资源;这使得其他项目更容易依赖您的代码的特定版本(如果您使用的是
    package\u data
    ,则多个版本与不同的非代码文件同时安装)。

    以我的经验,这只是一个迭代的问题。把你的数据和代码放在你认为它们去的任何地方。不管怎样,你很可能是错的。但是,一旦你对事情的发展有了更好的了解,你就可以更好地进行这些猜测了

    至于扩展源代码,我们在主干下有一个代码目录,其中包含一个python目录和一个其他各种语言目录。就我个人而言,我更倾向于下次尝试将任何扩展代码放入它自己的存储库中

    话虽如此,我还是回到我最初的观点:不要把它看得太大。把它放在对你有用的地方。如果您发现某些东西不起作用,那么可以(而且应该)对其进行更改。

    这通常是在《python on Freenode》中给出的答案

    Python项目的文件系统结构 做:

    • 将目录命名为与项目相关的名称。例如,如果项目名为“Twisted”,请为其源文件命名顶级目录
      Twisted
      。在发布版本时,应包含版本号后缀:
      Twisted-2.5
    • 创建一个目录
      Twisted/bin
      ,并将可执行文件放在那里(如果有的话)。不要给它们一个
      .py
      扩展名,即使它们是Python源文件。除了导入和调用项目中其他地方定义的主函数外,不要在其中放入任何代码。(轻微褶皱:由于在Windows上,解释器是由文件扩展名选择的,因此Windows用户实际上需要.py扩展名。因此,当您为Windows打包时,您可能需要添加它。不幸的是,据我所知,没有简单的distutils技巧来自动执行此过程。考虑到在POSIX上.py扩展名只是一个缺点,w在Windows上,缺少是一个实际的bug,如果您的用户群中包含Windows用户,您可能希望选择在任何地方都使用.py扩展名。)
    • 如果项目可以表示为单个Python源文件,则将其放入目录中,并将其命名为与项目相关的名称。例如,
      Twisted/Twisted.py
      。如果您需要多个源文件,请创建一个包(
      Twisted/Twisted/
      ,其中包含一个空的
      Twisted/Twisted/\uu init\uuuuuuuuuuuuuuuupy.py
      )并将源文件放在其中。例如,
      Twisted/Twisted/internet.py
    • 将单元测试放在包的子包中(注意-这意味着
      Project/
      |-- bin/
      |   |-- project
      |
      |-- project/
      |   |-- test/
      |   |   |-- __init__.py
      |   |   |-- test_main.py
      |   |   
      |   |-- __init__.py
      |   |-- main.py
      |
      |-- setup.py
      |-- README
      
      $ pwd
      ~/code/sandman
      $ tree
      .
      |- LICENSE
      |- README.md
      |- TODO.md
      |- docs
      |   |-- conf.py
      |   |-- generated
      |   |-- index.rst
      |   |-- installation.rst
      |   |-- modules.rst
      |   |-- quickstart.rst
      |   |-- sandman.rst
      |- requirements.txt
      |- sandman
      |   |-- __init__.py
      |   |-- exception.py
      |   |-- model.py
      |   |-- sandman.py
      |   |-- test
      |       |-- models.py
      |       |-- test_sandman.py
      |- setup.py