为什么有些Python包有重复的目录名?

时间:2016-04-10 03:36:17

标签: python packages python-import directory-structure subdirectory

在Stack Overflow上多次询问Python项目的目录结构的问题(例如hereherehere

给出了很多答案。但有一点似乎在任何答案中都不清楚,这就是为什么有些项目有重复的目录。例如,在经常被引用的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进程更顺畅?还有别的吗?

2 个答案:

答案 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 thingfrom 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包规则。