在我的项目中,我现在介绍了一个约定,即每个客户一个名称空间。在每个客户文件夹(cust1
,cust2
等)中,都有一个__init__.py
包含以下代码的文件:
import pkgutil
__path__ = pkgutil.extend_path(__path__, __name__)
__init__.py
程序包中的所有其他文件都是空的(主要是因为我还没有时间去弄清楚它们的其他用途)。
正如解释在这里,extend_path
可以确保Python是知道有一个包,身体的其他位置并在多个子包- 从我的理解-解释则不会停止搜索后未找到的第一个包路径下的模块它在中遇到sys.path
,但在中搜索所有路径__path__
。
from cust1.proj1.pack1.mod1 import something
from cust3.proj4.pack1.mod4 import something_else
from cust3.proj1.pack4.mod4 import yet_something_else
/path/
to/
projects/
cust1/
proj1/
Development/
code/
python/
cust1/
__init__.py <--- contains code as described above
proj1/
__init__.py <--- empty
pack1/
__init__.py <--- empty
mod1.py
但这对我来说似乎是可以接受的,尤其是考虑到我需要花很少的精力来维持这一惯例。为该项目sys.path
扩展/path/to/projects/cust1/proj1/Development/code/python
。
在一个旁注中,我注意到__init__.py
在同一个客户的所有文件中sys.path
,无论我从哪个项目中导入内容,都会执行路径中第一个出现的文件。