【问题标题】:transitive dynamic imports in python using the imp module使用 imp 模块在 python 中传递动态导入
【发布时间】:2015-06-17 21:50:15
【问题描述】:

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

【问题讨论】:

  • 换句话说:imp.load_module() 怎么不带路径参数?

标签: python import path


【解决方案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

【讨论】:

    猜你喜欢
    • 2011-06-25
    • 2017-02-20
    • 2011-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-04
    • 2017-10-11
    相关资源
    最近更新 更多