使用imp模块在python中传递动态导入

时间:2015-06-17 21:50:15

标签: python import path

我使用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

1 个答案:

答案 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