在Stack Overflow上多次询问Python项目的目录结构的问题(例如here,here和here)
给出了很多答案。但有一点似乎在任何答案中都不清楚,这就是为什么有些项目有重复的目录。例如,在经常被引用的this article中,建议的布局是:
<root>/
|-- Twisted/
| |-- __init__.py
| |-- README
| |-- setup.py
| |-- twisted/
| | |-- __init__.py
| | |-- main.py
| | |-- test/
| | | |-- __init__.py
| | | |-- test_main.py
| | | |-- test_other.py
| | |-- bin/
| | | |-- myprogram
在此示例中,/Twisted/twisted/main.py
是主文件
但另一方面,你有建议like this:
由于新的捆绑应用程序模板,许多开发人员正在很难构建他们的存储库。
<root>/
|-- samplesite/
| |-- manage.py
| |-- samplesite/
| | |-- settings.py
| | |-- wsgi.py
| | |-- sampleapp/
| | |-- models.py
不要这样做。
重复路径会让您的工具和开发人员感到困惑。不必要的筑巢对任何人都没有帮助。让我们正确地做到:
<root>/
|-- manage.py
|-- samplesite/
| |-- settings.py
| |-- wsgi.py
| |-- sampleapp/
| |-- models.py
我的问题不一定是&#34;哪种方式更好?&#34;,因为每种方式可能有利弊。
相反,我的问题是,如果我采用更简化的第二种风格,我将失去什么?是否有充分理由拥有/<root>/Twisted/twisted/main.py
目录结构而不只是/<root>/twisted/main.py
?是否可以更轻松地以某种方式共享我的应用程序或使import
进程更顺畅?还有别的吗?
答案 0 :(得分:2)
我相信python项目最常见的布局是这样的:
project/
|-- setup.py
|-- bin/
|-- docs/ ...
|-- examples/ ...
|-- package/
|-- __init__.py
|-- module1.py
|-- module2.py
|-- subpackage/ ...
|-- tests/ ...
项目的名称是项目的名称,包是顶级导入的名称,例如scikits-learn和sklearn。该包具有python应该能够导入的所有内容,并使用包名称导入。例如from package import thing
或from package.module1 import thing
。该项目包含包和任何支持的内容,如文档,示例和安装脚本。请注意,项目中通常没有__init__.py
因为项目不是python可导入的。项目和包通常具有相同的名称,但不是必需的。
答案 1 :(得分:0)
这两份文件比你想象的更接近。 Interesting Things, Largely Python and Twisted Related(您的第一个示例)和django-admin startproject文档都假定您在项目存储库之外,而Structuring Your Project(您的第二个示例)假定您在存储库中。引用,&#34;好吧,他们会去他们新的存储库并运行以下内容......&#34; 。
django docs声明如果你运行
django-admin.py start-project samplesite
将命名项目目录和项目包,并在当前创建项目目录 工作目录
该命令为您创建项目目录,因此当您运行它时,您当然不应该在已创建的项目目录中。文档继续说
django-admin startproject myproject /Users/jezdez/Code/myproject_repo
如果提供了可选目的地,Django将使用该现有目的地 目录作为项目目录
现在,假设您已经在/Users/jezdez/Code/myproject_repo
。然后你会做
django-admin startproject myproject .
在当前目录中创建项目包。瞧,你已经得到了第二个作者的榜样!如果你在运行命令之前创建了repo,作者真的只是告诉你要避开第一个表单。
所以,让我们重新绘制你的目录结构。在第一个示例中,<root>
是您保存开发回购的目录。 Twisted
是您的repo的目录。 (顺便说一下,该目录不应该有__init__.py
,因为它不是包目录)。在最后一个示例中,<root>
是repo目录本身。假设我将该目录命名为DjangoExample,那么结构将是
<root>
|-- Twisted/
| |-- __init__.py
| |-- README
| |-- setup.py
| |-- twisted/
| | |-- __init__.py
| | |-- main.py
| | |-- test/
| | | |-- __init__.py
| | | |-- test_main.py
| | | |-- test_other.py
| | |-- bin/
| | | |-- myprogram
|
|-- DjangoExample/
| |-- manage.py
| |-- samplesite/
| | |-- settings.py
| | |-- wsgi.py
| | |-- sampleapp/
| | |-- models.py
至于其他差异,django应用程序必须遵循django框架规则,而twised遵循更通用的python包规则。