想象一下,您想用Python开发一个平凡的最终用户桌面(非Web)应用程序。 构造项目文件夹层次结构的最佳方法是什么? python
理想的功能是易于维护,IDE友好,适用于源代码控制分支/合并以及易于生成安装软件包。 api
尤为是: app
没什么大不了的。 令您快乐的一切都会起做用。 没有不少愚蠢的规则,由于Python项目能够很简单。 工具
/scripts
或/bin
用于那种命令行界面 /tests
进行测试 /lib
用于您的C语言库 /doc
获取大多数文档 /apidoc
用于Epydoc生成的API文档。 顶级目录能够包含自述文件,配置文件和其余内容。 布局
艰难的选择是是否使用/src
树。 像Java或C同样,Python在/src
, /lib
和/bin
之间没有区别。 测试
因为某些人认为顶级/src
目录没有意义,所以顶级目录能够是应用程序的顶级体系结构。 ui
/foo
/bar
/baz
我建议将全部这些都放在“个人产品名称”目录下。 所以,若是您正在编写一个名为quux
的应用程序,则包含全部这些内容的目录将命名为/quux
。 spa
而后,另外一个项目的PYTHONPATH
能够包含/path/to/quux/foo
以重用QUUX.foo
模块。 命令行
就我而言,因为我使用Komodo Edit,因此个人IDE cuft是单个.KPF文件。 我实际上将其放在顶级/quux
目录中,并省略了将其添加到SVN中的状况。 code
最好使用setuptools中的package_data
支持将非Python数据捆绑在Python模块中。 我强烈建议您使用名称空间包来建立多个项目可使用的共享名称空间,这很像Java约定,即将软件包放在com.yourcompany.yourproject
(并可以拥有共享的com.yourcompany.utils
名称空间)。
从新分支和合并,若是使用足够好的源代码控制系统,即便经过重命名也能够处理合并; 集市在这方面尤为擅长。
与这里的其余答案相反,我对src
顶级目录(带有doc
和test
目录)+1。 文档目录树的特定约定将根据您所使用的内容而有所不一样。 例如, Sphinx有其快速启动工具支持的本身的约定。
请,请利用setuptools和pkg_resources; 这使得其余项目更容易依赖于代码的特定版本(若是使用package_data
,则能够同时将多个版本与不一样的非代码文件一块儿安装)。
以个人经验,这只是迭代问题。 将您的数据和代码放在您认为任何地方。 颇有可能,不管如何你都会错的。 可是,一旦您对事物的确切形状有了一个更好的了解,您就能够进行这些猜想。
至于扩展源,咱们在主干下有一个Code目录,其中包含python目录和各类其余语言的目录。 就我的而言,下一次我更倾向于尝试将任何扩展代码放入其本身的存储库中。
话虽如此,我回到个人初衷:不要作太大的事情。 将其放在彷佛对您有用的地方。 若是您发现不起做用的地方,则能够(而且应该)对其进行更改。
以正确的方式查看Open Sourcing Python项目 。
让我摘录那篇优秀文章的项目布局部分:
设置项目时,布局(或目录结构)对于正确设置很重要。 合理的布局意味着潜在的贡献者没必要花大量的时间寻找代码。 文件位置很直观。 因为咱们正在处理现有项目,所以这意味着您可能须要移动一些内容。
让咱们从顶部开始。 大多数项目都有许多顶级文件(例如setup.py,README.md,requirements.txt等)。 每一个项目应具备三个目录:
- 包含项目文档的docs目录
- 以项目名称命名的目录,用于存储实际的Python包
- 在两个位置之一中的测试目录
- 在包含测试代码和资源的包目录下
- 做为独立的顶层目录为了更好地了解文件的组织方式,如下是个人一个项目sandman的布局简化快照:
$ 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
如您所见,有一些顶级文件,一个docs目录(生成的是一个空目录,sphinx将在其中放置生成的文档),一个sandman目录和一个sandman下的test目录。
尝试使用python_boilerplate模板启动项目。 它在很大程度上遵循了最佳实践(例如此处的 ),可是若是您发现本身愿意在某个时候将您的项目分红多个鸡蛋(而且相信我,除了最简单的项目以外的其余任何东西),它会更适合。常见的状况是您必须使用其余人库的本地修改版本)。
您将源放在哪里?
PROJECT_ROOT/src/<egg_name>
下的单独setuptools-layout PROJECT_ROOT/src/<egg_name>
。 您将应用程序启动脚本放在哪里?
entry_point
。 您将IDE项目放在哪里?
PROJECT_ROOT/.<something>
中,这很好。 您将单元/验收测试放在哪里?
PROJECT_ROOT/src/<egg_name>/tests
目录中。 我我的更喜欢使用py.test
来运行它们。 您将非Python数据(例如配置文件)放在哪里?
pkg_resources
包从setuptools
经过,或由于Python 3.7 importlib.resources
从标准库模块。 PROJECT_ROOT/config
。 对于部署,能够有多种选择。 在Windows上,可使用%APP_DATA%/<app-name>/config
,在Linux上,可使用/etc/<app-name>
或/opt/<app-name>/config
。 PROJECT_ROOT/var
的发展过程当中,以及在/var
Linux部署中。 PROJECT_ROOT/src/<egg_name>/native
文档一般会放在PROJECT_ROOT/doc
或PROJECT_ROOT/src/<egg_name>/doc
(这取决于您是否将某些鸡蛋视为一个单独的大型项目)。 一些其余配置将在文件PROJECT_ROOT/buildout.cfg
和PROJECT_ROOT/setup.cfg
。