如何在完整路径下加载Python模块?请注意,该文件可以位于文件系统中的任何位置,因为它是一个配置选项.
我正在为几个客户同时开发几个Python项目.我的项目文件夹结构的简化版本如下所示:
/path/
to/
projects/
cust1/
proj1/
pack1/
__init__.py
mod1.py
proj2/
pack2/
__init__.py
mod2.py
cust2/
proj3/
pack3/
__init__.py
mod3.py
Run Code Online (Sandbox Code Playgroud)
当我例如希望从使用功能proj1,我延伸sys.path通过/path/to/projects/cust1/proj1(例如,通过设置PYTHONPATH或添加.pth文件到site_packages文件夹或甚至修改sys.path直接地),然后导入模块是这样的:
>>> from pack1.mod1 import something
Run Code Online (Sandbox Code Playgroud)
当我处理更多项目时,不同的项目具有相同的包名称:
/path/
to/
projects/
cust3/
proj4/
pack1/ <-- same package name as in cust1/proj1 above
__init__.py
mod4.py
Run Code Online (Sandbox Code Playgroud)
如果我现在简单地扩展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
Run Code Online (Sandbox Code Playgroud)
我认为第二次导入失败的原因是Python只搜索 …
我正在处理一个需要多个同名模块的项目。这是架构的代表性摘录,其中包含__init__.py显示哪些文件夹是模块的文件:
/path1
/ProjectA
__init__.py
/src
__init__.py
/ctrl
__init__.py
somectrl.py
...
/path2
/ProjectA
__init__.py
/src
__init__.py
someclass.py
Run Code Online (Sandbox Code Playgroud)
在我的课堂上someclass.py,我想像这样导入somectrl.py:
from ProjectA.src.ctrl import somectrl
Run Code Online (Sandbox Code Playgroud)
但是导入失败:它告诉我没有ctrl包。似乎它只是查看ProjectAfrom path2,而完全忽略ProjectAfrom path1!双方path1并path2都在我PYTHONPATH。那他们两个都联系不上吗?
有没有干净的方法摆脱这种令人讨厌的情况?