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

想象一下,您想用Python开发一个平凡的最终用户桌面(非Web)应用程序。 构造项目文件夹层次结构的最佳方法是什么? python

理想的功能是易于维护,IDE友好,适用于源代码控制分支/合并以及易于生成安装软件包。 api

尤为是: app

  1. 您将源放在哪里?
  2. 您将应用程序启动脚本放在哪里?
  3. 您将IDE项目放在哪里?
  4. 您将单元/验收测试放在哪里?
  5. 您将非Python数据(例如配置文件)放在哪里?
  6. 您将pyd / so二进制扩展模块的非Python源代码(例如C ++)放在哪里?

#1楼

没什么大不了的。 令您快乐的一切都会起做用。 没有不少愚蠢的规则,由于Python项目能够很简单。 工具

  • /scripts/bin用于那种命令行界面
  • /tests进行测试
  • /lib用于您的C语言库
  • /doc获取大多数文档
  • /apidoc用于Epydoc生成的API文档。

顶级目录能够包含自述文件,配置文件和其余内容。 布局

艰难的选择是是否使用/src树。 像Java或C同样,Python在/src/lib/bin之间没有区别。 测试

因为某些人认为顶级/src目录没有意义,所以顶级目录能够是应用程序的顶级体系结构。 ui

  • /foo
  • /bar
  • /baz

我建议将全部这些都放在“个人产品名称”目录下。 所以,若是您正在编写一个名为quux的应用程序,则包含全部这些内容的目录将命名为/quuxspa

而后,另外一个项目的PYTHONPATH能够包含/path/to/quux/foo以重用QUUX.foo模块。 命令行

就我而言,因为我使用Komodo Edit,因此个人IDE cuft是单个.KPF文件。 我实际上将其放在顶级/quux目录中,并省略了将其添加到SVN中的状况。 code


#2楼

最好使用setuptools中package_data支持将非Python数据捆绑在Python模块中。 我强烈建议您使用名称空间包来建立多个项目可使用的共享名称空间,这很像Java约定,即将软件包放在com.yourcompany.yourproject (并可以拥有共享的com.yourcompany.utils名称空间)。

从新分支和合并,若是使用足够好的源代码控制系统,即便经过重命名也能够处理合并; 集市在这方面尤为擅长。

与这里的其余答案相反,我对src顶级目录(带有doctest目录)+1。 文档目录树的特定约定将根据您所使用的内容而有所不一样。 例如, Sphinx有其快速启动工具支持的本身的约定。

请,请利用setuptools和pkg_resources; 这使得其余项目更容易依赖于代码的特定版本(若是使用package_data ,则能够同时将多个版本与不一样的非代码文件一块儿安装)。


#3楼

以个人经验,这只是迭代问题。 将您的数据和代码放在您认为任何地方。 颇有可能,不管如何你都会错的。 可是,一旦您对事物的确切形状有了一个更好的了解,您就能够进行这些猜想。

至于扩展源,咱们在主干下有一个Code目录,其中包含python目录和各类其余语言的目录。 就我的而言,下一次我更倾向于尝试将任何扩展代码放入其本身的存储库中。

话虽如此,我回到个人初衷:不要作太大的事情。 将其放在彷佛对您有用的地方。 若是您发现不起做用的地方,则能够(而且应该)对其进行更改。


#4楼

以正确的方式查看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目录。


#5楼

尝试使用python_boilerplate模板启动项目。 它在很大程度上遵循了最佳实践(例如此处的 ),可是若是您发现本身愿意在某个时候将您的项目分红多个鸡蛋(而且相信我,除了最简单的项目以外的其余任何东西),它会更适合。常见的状况是您必须使用其余人库的本地修​​改版本)。

  • 您将源放在哪里?

    • 对于大型项目,将源分红几个鸡蛋是有意义的。 每一个鸡蛋将做为PROJECT_ROOT/src/<egg_name>下的单独setuptools-layout PROJECT_ROOT/src/<egg_name>
  • 您将应用程序启动脚本放在哪里?

    • 理想的选择是将应用程序启动脚本注册为其中一个鸡蛋中的entry_point
  • 您将IDE项目放在哪里?

    • 取决于IDE。 他们中的许多人将他们的东西保存在项目根目录的PROJECT_ROOT/.<something>中,这很好。
  • 您将单元/验收测试放在哪里?

    • 每一个鸡蛋都有一组单独的测试,保存在其PROJECT_ROOT/src/<egg_name>/tests目录中。 我我的更喜欢使用py.test来运行它们。
  • 您将非Python数据(例如配置文件)放在哪里?

    • 这取决于。 可能有不一样类型的非Python数据。
      • “资源” ,即必须包装在一个鸡蛋中的数据。 该数据进入包名称空间中某个位置的相应egg目录。 它能够经过使用pkg_resources包从setuptools经过,或由于Python 3.7 importlib.resources从标准库模块。
      • “配置文件” ,即非Python文件,它们被视为项目源文件的外部文件,但在应用程序开始运行时必须使用一些值进行初始化。 在开发期间,我更喜欢将此类文件保留在PROJECT_ROOT/config 。 对于部署,能够有多种选择。 在Windows上,可使用%APP_DATA%/<app-name>/config ,在Linux上,可使用/etc/<app-name>/opt/<app-name>/config
      • 生成的文件 ,即应用程序在执行期间能够建立或修改的文件。 我宁愿让他们在PROJECT_ROOT/var的发展过程当中,以及在/var Linux部署中。
  • 您将pyd / so二进制扩展模块的非Python源代码(例如C ++)放在哪里?
    • 进入PROJECT_ROOT/src/<egg_name>/native

文档一般会放在PROJECT_ROOT/docPROJECT_ROOT/src/<egg_name>/doc (这取决于您是否将某些鸡蛋视为一个单独的大型项目)。 一些其余配置将在文件PROJECT_ROOT/buildout.cfgPROJECT_ROOT/setup.cfg

相关文章
相关标签/搜索