【发布时间】:2012-02-14 18:01:56
【问题描述】:
我正在同时为多个客户开发多个 Python 项目。我的项目文件夹结构的简化版本如下所示:
/path/
to/
projects/
cust1/
proj1/
pack1/
__init__.py
mod1.py
proj2/
pack2/
__init__.py
mod2.py
cust2/
proj3/
pack3/
__init__.py
mod3.py
例如,当我想使用来自proj1 的功能时,我将sys.path 扩展为/path/to/projects/cust1/proj1(例如通过设置PYTHONPATH 或将.pth 文件添加到site_packages 文件夹,甚至修改@987654329 @直接),然后像这样导入模块:
>>> from pack1.mod1 import something
随着我从事的项目越来越多,碰巧不同的项目具有相同的包名称:
/path/
to/
projects/
cust3/
proj4/
pack1/ <-- same package name as in cust1/proj1 above
__init__.py
mod4.py
如果我现在简单地将sys.path 扩展为/path/to/projects/cust3/proj4,我仍然可以从proj1 导入,但不能从proj4 导入:
>>> from pack1.mod1 import something
>>> from pack1.mod4 import something_else
ImportError: No module named mod4
我认为第二次导入失败的原因是 Python 仅搜索 sys.path 中的第一个文件夹,在那里它找到了 pack1 包,如果在其中找不到 mod4 模块则放弃。我在之前的问题中问过这个问题,请参阅import python modules with the same name,但我仍然不清楚内部细节。
无论如何,显而易见的解决方案是通过将项目目录转换为超级包来添加另一层命名空间限定:将__init__.py 文件添加到每个proj* 文件夹并从扩展sys.path 的行中删除这些文件夹,例如
$ export PYTHONPATH=/path/to/projects/cust1:/path/to/projects/cust3
$ touch /path/to/projects/cust1/proj1/__init__.py
$ touch /path/to/projects/cust3/proj4/__init__.py
$ python
>>> from proj1.pack1.mod1 import something
>>> from proj4.pack1.mod4 import something_else
现在我遇到了不同客户的不同项目具有相同名称的情况,例如
/path/
to/
projects/
cust3/
proj1/ <-- same project name as for cust1 above
__init__.py
pack4/
__init__.py
mod4.py
由于与以前相同的原因,尝试从 mod4 导入不再起作用:
>>> from proj1.pack4.mod4 import yet_something_else
ImportError: No module named pack4.mod4
按照之前解决此问题的相同方法,我将添加另一个包/命名空间层并将客户文件夹转换为超级超级包。
但是,这与我对项目文件夹结构的其他要求相冲突,例如
- 开发/发布结构以维护多个代码行
- 其他类型的源代码,例如JavaScript、SQL 等
- 源文件以外的其他文件,例如文件或数据。
对一些项目文件夹的简化、更真实的描述如下所示:
/path/
to/
projects/
cust1/
proj1/
Development/
code/
javascript/
...
python/
pack1/
__init__.py
mod1.py
doc/
...
Release/
...
proj2/
Development/
code/
python/
pack2/
__init__.py
mod2.py
我不明白如何才能满足 python 解释器对文件夹结构的要求以及我同时拥有的要求。也许我可以创建一个带有一些符号链接的额外文件夹结构并在sys.path 中使用它,但是看看我已经做出的努力,我觉得我的整个方法存在根本性的问题。在旁注中,我也很难相信 python 真的限制了我选择源代码文件夹名称,就像在所描述的情况下那样。
如何设置我的项目文件夹和sys.path,以便在存在名称相同的项目和包的情况下以一致的方式从所有项目中导入?
【问题讨论】:
标签: python path python-import