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

理想的特性是易于维护、ide友好性、适合源代码控制分支/合并,以及易于生成安装包。

特别是:

你把源头放在哪里? 应用程序启动脚本放在哪里? 你把IDE项目的cruft放在哪里? 你把单元/验收测试放在哪里? 你把非python数据放在哪里,比如配置文件? 你把非python源代码放在哪里,比如pyd/二进制扩展模块的c++ ?


当前回答

不太重要。只要能让你开心就行。没有很多愚蠢的规则,因为Python项目可以很简单。

/scripts或/bin之类的命令行界面 /测试你的测试 /lib为您的c语言库 /doc用于大多数文档 /apidoc用于epydoc生成的API文档。

顶层目录可以包含README, Config等等。

困难的选择是是否使用/src树。Python不像Java或C那样区分/src、/lib和/bin。

由于一些人认为顶级/src目录没有意义,所以顶级目录可以是应用程序的顶级体系结构。

/ foo /酒吧 /巴兹

我建议把所有这些都放在“我的产品名称”目录下。如果你写一个名为quux的应用程序,包含这些东西的目录就叫做/quux。

然后,另一个项目的PYTHONPATH可以包含/path/to/quux/foo来重用quux。foo模块。

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

其他回答

不太重要。只要能让你开心就行。没有很多愚蠢的规则,因为Python项目可以很简单。

/scripts或/bin之类的命令行界面 /测试你的测试 /lib为您的c语言库 /doc用于大多数文档 /apidoc用于epydoc生成的API文档。

顶层目录可以包含README, Config等等。

困难的选择是是否使用/src树。Python不像Java或C那样区分/src、/lib和/bin。

由于一些人认为顶级/src目录没有意义,所以顶级目录可以是应用程序的顶级体系结构。

/ foo /酒吧 /巴兹

我建议把所有这些都放在“我的产品名称”目录下。如果你写一个名为quux的应用程序,包含这些东西的目录就叫做/quux。

然后,另一个项目的PYTHONPATH可以包含/path/to/quux/foo来重用quux。foo模块。

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

根据Jean-Paul Calderone的Python项目文件系统结构:

Project/
|-- bin/
|   |-- project
|
|-- project/
|   |-- test/
|   |   |-- __init__.py
|   |   |-- test_main.py
|   |   
|   |-- __init__.py
|   |-- main.py
|
|-- setup.py
|-- README

非Python数据最好使用setuptools中的package_data支持绑定到Python模块中。我强烈推荐的一件事是使用名称空间包来创建多个项目可以使用的共享名称空间——很像将包放在com.yourcompany.yourproject中的Java约定(并且能够拥有一个共享的com.yourcompany.utils名称空间)。

再分支和合并,如果你使用一个足够好的源代码控制系统,它甚至可以通过重命名来处理合并;芭莎在这方面尤其在行。

与这里的其他一些答案相反,我赞成将src目录作为顶级目录(附带doc和test目录)。文档目录树的特定约定将根据您使用的内容而有所不同;例如,Sphinx有自己的快速入门工具支持的约定。

请,请利用setuptools和pkg_resources;这使得其他项目更容易依赖于您代码的特定版本(如果使用package_data,则可以使用不同的非代码文件同时安装多个版本)。

“Python打包权威”有一个样本项目:

https://github.com/pypa/sampleproject

它是一个示例项目,作为Python打包用户指南的打包和分发项目教程的辅助而存在。

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

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

说了这么多,我回到我最初的观点:不要把它看得太大。把它放在对你有用的地方。如果你发现某些东西不起作用,它可以(也应该)被改变。