【问题标题】:Why do some Python packages have repetitive directory names?为什么有些 Python 包的目录名有重复?
【发布时间】:2016-04-10 03:36:17
【问题描述】:

在 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

我的问题不一定是“哪种方式更好?”,因为每种方式都可能有利或有弊。

相反,我的问题是,如果我采用更简化的第二种样式,我会失去什么?是否有充分的理由拥有 /&lt;root&gt;/Twisted/twisted/main.py 目录结构而不仅仅是 /&lt;root&gt;/twisted/main.py ?是否可以更轻松地共享我的应用程序或使import 流程更顺畅?还有什么?

【问题讨论】:

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


    【解决方案1】:

    我相信最常见的python项目布局是这样的:

    project/
    |-- setup.py
    |-- bin/
    |-- docs/ ...
    |-- examples/ ...
    |-- package/
        |-- __init__.py
        |-- module1.py
        |-- module2.py
        |-- subpackage/ ...
        |-- tests/ ...
    

    其中 project 是项目的名称,package 是顶级导入的名称,例如 scikits-learn 和 sklearn。该包包含 python 应该能够导入的所有内容,并且您使用包名进行导入。例如from package import thingfrom package.module1 import thing。该项目有包和任何支持的东西,如文档、示例和安装脚本。请注意,项目中通常没有 __init__.py,因为项目不是 python 可导入的。项目和包同名是很常见的,但不是必需的。

    【讨论】:

    • 非常有帮助 - 谢谢。我现在了解项目目录和包目录之间的区别。
    【解决方案2】:

    这两个文件比你想象的更接近。 Interesting Things, Largely Python and Twisted Related(您的第一个示例)和 django-admin startproject 文档都假定您在项目存储库之外,而 Structuring Your Project(您的第二个示例)假定您在存储库内。引用,“好吧,他们去他们的裸和新鲜的存储库并运行以下......”

    django 文档指出,如果你运行

    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 .
    

    在当前目录下创建项目包。瞧,你有第二作者的例子!作者实际上只是告诉您,如果您在运行命令之前创建仓库,请避免使用第一种形式。

    所以,让我们重新绘制您的目录结构。在第一个示例中,&lt;root&gt; 是您保存开发存储库的目录。 Twisted 是您的仓库所在的目录。 (顺便说一句,该目录不应该有__init__.py,因为它不是包目录)。在最后一个示例中,&lt;root&gt; 是 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 包规则。

    【讨论】:

    • 啊,这解释了看似矛盾的准则。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 2011-09-25
    • 1970-01-01
    • 1970-01-01
    • 2021-05-28
    • 2020-06-08
    • 2011-10-16
    相关资源
    最近更新 更多