Python应用程序的最佳项目结构是什么?
假设您想用Python开发一个不平凡的最终用户桌面(而不是web)应用程序。构建项目文件夹层次结构的最佳方法是什么 理想的特性是易于维护、IDE友好、适用于源代码管理分支/合并以及易于生成安装包 特别是:Python应用程序的最佳项目结构是什么?,python,directory-structure,organization,project-structure,Python,Directory Structure,Organization,Project Structure,假设您想用Python开发一个不平凡的最终用户桌面(而不是web)应用程序。构建项目文件夹层次结构的最佳方法是什么 理想的特性是易于维护、IDE友好、适用于源代码管理分支/合并以及易于生成安装包 特别是: 你把源头放在哪里 应用程序启动脚本放在哪里 你把IDE项目放在哪里 您将单元/验收测试放在哪里 您将非Python数据(如配置文件)放在哪里 您在PyD/SO二进制扩展模块中使用了诸如C++之类的非Python源? 没什么大不了的。任何让你快乐的事情都会成功。没有太多愚蠢的规则,因为Pytho
没什么大不了的。任何让你快乐的事情都会成功。没有太多愚蠢的规则,因为Python项目可以很简单
或/scripts
用于那种命令行界面的东西/bin
用于您的测试/tests
用于您的C语言库/lib
用于大多数文档/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
扩展名,即使它们是Python源文件。除了导入和调用项目中其他地方定义的主函数外,不要在其中放入任何代码。(轻微褶皱:由于在Windows上,解释器是由文件扩展名选择的,因此Windows用户实际上需要.py扩展名。因此,当您为Windows打包时,您可能需要添加它。不幸的是,据我所知,没有简单的distutils技巧来自动执行此过程。考虑到在POSIX上.py扩展名只是一个缺点,w在Windows上,缺少是一个实际的bug,如果您的用户群中包含Windows用户,您可能希望选择在任何地方都使用.py扩展名。).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