【发布时间】:2013-08-07 20:52:10
【问题描述】:
我正在一个项目中编写一系列 Python 脚本;每个脚本都在项目的子目录中,如下所示:
projectroot
|
|- subproject1
| |
| |- script1.main.py
| `- script1.merger.py
|
|- subproject2
| |
| |- script2.main.py
| |- script2.matcher.py
| `- script2.merger.py
|
`- subproject3
|
|- script3.main.py
|- script3.converter.py
|- script3.matcher.py
`- script3.merger.py
现在几个脚本共享一些代码。共享代码最好被认为是项目本身的一部分,而不是我会单独编译并从中制作一个库或放入站点范围的 PYTHONPATH 的东西。我可以将该代码放在不同的地方,比如projectroot 目录本身,或者projectroot 的子目录common(也许)。
但是,到目前为止,我想到的大多数方法都涉及使用空 __init__.py 文件从我的子项目中制作包并使用相对导入(或在每个子项目中冗余地弄乱sys.path。更糟糕的是,这似乎是在构建围绕这一系列脚本的包结构与来自被拒绝的PEP-3122 的以下警告相冲突:
注意!此 PEP 已被拒绝。 Guido 将包中运行的脚本视为反模式。
如果包中的脚本是反模式的,我该如何设置以将公共代码保留在同一个项目中?或者这里可以接受基于模块和包的系统吗?哪种方法最干净? (FWIW 我宁愿在项目根目录中有一个诸如 shared.py 或 common.py 之类的文件,而不是创建一个与“真实”子项目同级的实用程序目录。)
【问题讨论】:
-
我相信 django 使用集中入口点
manage.py来运行它的所有脚本。这样做可以让您将subprojectX转换为包,并在“manage.py”(入口点)脚本中集中处理导入。作为包,我相信它会很容易地支持common模块,您的共享功能可以在其中存在。 -
我认为应该是 PEP-3122,而不是 PEP-32122。
标签: python python-module pythonpath