假设 mine.py 想要导入 moduleA 和 moduleB,但是 moduleA 和 moduleB 都尝试导入一个名为“moduleC”的模块。这是两个不同的模块,它们都恰好被命名为“moduleC”。当 mine.py 运行时,根据 sys.path 模块A 或模块B 得到正确的“模块C”,另一个得到一个惊喜,随之而来的是混乱。
如果 moduleA 和 moduleB 是由不同的作者编写的,而不是我们,最好不要修改这些模块。mine.py 的作者是否有任何不修改模块A 或模块B 的解决方案?
以下问题询问当您是 moduleA 或 moduleB 的作者时如何解决此问题。
当有同名的本地模块时,如何在 Python 中访问标准库模块?
我的具体情况
我想在 Python 调试器 pdb 下运行一个名为 PyMOL 的程序。不幸的是,PyMOL 有一个它导入的“cmd.py”,它与 pdb 导入的常用 cmd 冲突。
PyMOL 安装的相关部分如下所示:
pymol/
__init__.py
cmd.py
PyMOL 通过执行__init__.py
. 该文件然后导入cmd
为from pymol import cmd
.
pdb
根据BrenBarn 指出的内容,到目前为止,我可以cmd
通过暂时pymol
从sys.path
. 之后,当 PyMOL 尝试导入它时,cmd
它会崩溃。不知何故,我需要在导入之前但在导入之后cmd
从导入模块搜索中删除 Python 。PyMOL
pdb
最小的例子
$ ls
pymol/
$ ls pymol/
__init__.py cmd.py
初始化.py
# insert some code into __init__.py directly
import sys
pymol_path = sys.path[0]
sys.path[0] = ""
import pdb
sys.path[0] = pymol_path
from pymol import cmd
# test a sandwich of calls that require each "cmd" modules
pdb.set_trace()
cmd.foo()
pdb.set_trace()
cmd.foo()
print "done!"
# original PyMOL __init__.py code would follow
命令文件
def foo():
print("cmd.foo()")
尝试一下
$ PYTHONPATH= python ./pymol/__init__.py
> /Users/khouli/scr/pymol_scr/pymol/__init__.py(11)<module>()
-> cmd.foo()
(Pdb) continue
cmd.foo()
> /Users/khouli/scr/pymol_scr/pymol/__init__.py(13)<module>()
-> cmd.foo()
(Pdb) continue
cmd.foo()
done!
编辑:上面给出的方法现在似乎有效,但正如 BrenBarn 的回答所述,可能没有解决方案可以使所有第三方代码都像最初要求的问题一样不被修改。这是由于 PyMOL 中的怪癖。