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

末鹿安然 提交于 2019-12-24 18:18:16

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

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

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

尤其是:

  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目录没有意义,因此顶级目录可以是应用程序的顶级体系结构。

  • /foo
  • /bar
  • /baz

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

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

就我而言,由于我使用Komodo Edit,所以我的IDE cuft是单个.KPF文件。 我实际上将其放在顶级/quux目录中,并省略了将其添加到SVN中的情况。


#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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!