我使用imp
模块动态导入Python模块。效果很好。
但是我的一位同事想要将一些模块重构到同一目录中的另一个模块中,这会破坏事情。我如何让它工作?我将正确的道路传递到find_module
;对bar
的动态导入工作正常,但当bar
尝试从同一目录中引入baz
时,它会失败。源代码在下面和github上重现。
C:\tmp\git\python-imp-bug>cd a
C:\tmp\git\python-imp-bug\a>python foo.py
Traceback (most recent call last):
File "foo.py", line 7, in <module>
m = find_and_load('bar',['../b'])
File "foo.py", line 5, in find_and_load
return imp.load_module(module, file, pathname, description)
File "../b\bar.py", line 1, in <module>
import baz
ImportError: No module named baz
A / foo.py:
import imp
def find_and_load(module, path):
file, pathname, description = imp.find_module(module, path)
return imp.load_module(module, file, pathname, description)
m = find_and_load('bar',['../b'])
B / bar.py:
import baz
def tweedledee():
return 42
B / baz.py:
def tweedledum():
return 24
答案 0 :(得分:1)
叽。通过修改sys.path找到了一个临时的解决方法,虽然我不喜欢它。似乎应该有一种方法可以做到这一点,而不会搞乱sys.path。我尝试捕获ImportError
,但它只包含一个字符串而不是尝试导入的模块的名称(是的,我可以解析该字符串,但这完全是错误的)
A / foo.py:
import imp
import sys
def find_and_load(module, path):
file, pathname, description = imp.find_module(module, path)
try:
n = len(sys.path)
sys.path += path
return imp.load_module(module, file, pathname, description)
finally:
del sys.path[n:]
file.close()
m = find_and_load('bar',['../b'])
print m.tweedledee() + m.tweedledum()
B / bar.py:
import baz
def tweedledee():
return 42
tweedledum = baz.tweedledum