编辑以提供更好的问题清晰度
是否有推荐或标准的方式来组织大型 python 应用程序——例如,需要不同子目录中的多个文件来组织清晰的项目。
我能找到的所有文档都在谈论包,在我看来,在任何其他语言中都可以称为库。即主程序包含/需要的代码。包中的 setup.py 增加了这种混乱,因为它看起来应该是整个应用程序的主程序/脚本,但它被用来将模块作为库“安装”。
简而言之,将代码组织为应用程序(您实际运行的程序)的标准/建议。不是库/包(应用程序包含/使用的东西)
编辑以提供更好的问题清晰度
是否有推荐或标准的方式来组织大型 python 应用程序——例如,需要不同子目录中的多个文件来组织清晰的项目。
我能找到的所有文档都在谈论包,在我看来,在任何其他语言中都可以称为库。即主程序包含/需要的代码。包中的 setup.py 增加了这种混乱,因为它看起来应该是整个应用程序的主程序/脚本,但它被用来将模块作为库“安装”。
简而言之,将代码组织为应用程序(您实际运行的程序)的标准/建议。不是库/包(应用程序包含/使用的东西)
组织大型应用程序的一种方法(不是唯一方法)是使用virtualenv
和的组合buildout
。
virtualenv
让您创建一个独立的 Python 环境。这很重要,因为任何大型 Python 应用程序都将依赖于一堆包(有些是您自己编写的,有些是您从其他地方安装的)。当您的系统 python 已经安装了 3.2.1 版本时,您不希望您的应用程序需要 1.2.3 版本的包,因此您需要将您的应用程序与正在运行的任何其他应用程序隔离开来。
buildout
很有用,因为它允许您定义应用程序的所有依赖项并从头开始重复构建它。
使用的项目的目录结构buildout
如下所示:
project/
bootstrap.py
buildout.cfg
.installed.cfg
parts/
develop-eggs/
bin/
buildout
mypython
eggs/
downloads/
该bootstrap.py
文件是构建的标准文件,并创建bin
包含本地 python 和buildout
命令的文件夹。bin\buildout
然后使用buildout.cfg
(这是您实际必须创建的唯一文件)下载和安装应用程序所需的所有其他内容。.installed.cfg
保存已运行命令的记录,因此如果buildout.cfg
更新并重新运行bin/buildout
它,它可以卸载不再需要的任何内容并安装任何新内容。
大型 Python 项目,如 Plone 和 Django 使用buildout
,请参阅http://jacobian.org/writing/django-apps-with-buildout/以获得描述它的好博客文章。
好的,所以 setup.py 文件是安装程序脚本,而不是主程序。将 setup.py 文件想象为 Window Installer。
Python 文件称为模块。现在,假设您有一个分为几个模块的应用程序。你可以做两件事:
1.将附加模块放在与主脚本相同的目录中,以便可以导入它们。
2.在主脚本的目录中创建一个单独的文件夹,并将附加模块以及 __init__.py 脚本放在那里。这是一个包。
现在,您可能想知道 __init__.py 文件到底是做什么的。它的作用是告诉 Python 如何导入文件夹中的模块。这是一个示例:
import module1, module2'
__all__ = ['module1', 'module2']
__all__ 变量告诉 Python 哪些模块可以从外部导入。导入实际上告诉 Python 在您导入包时导入了哪些模块。包名称是文件夹名称。假设文件夹名为 hello。您将像这样导入包:
import hello
#Do stuff with hello
hello.module1.somefunction()
因此,init 文件中的导入告诉 Python 在导入包时导入了哪些模块。
但是,假设你不想导入所有的你好。假设您只想要模块1。你会这样做:
from hello import module1
module1.somefunction()
这就是 __all__ 变量的用途。它告诉 Python 可以单独导入什么。
如果您需要进一步说明,请发表评论。
澄清一些困惑,setup.py
是安装脚本,而不是主要入口点。Python 应用程序可能包括几种与“主要入口点”交互的方式,包括几个命令行脚本、一个可以执行的“主要”入口点python -m name.of.package
和一个 GUI。
如果您需要包含通常包含在应用程序顶层的额外数据:
your_project_root/
data/
additional/
directories/
and.files
project_name/
__init__.py
package.py
and.py
module.py
files.py
go/
__init__.py
here.py
setup.py
README.rst
# Other top-level stuff as needed