给定完整的模块路径动态导入可调用对象?

时间:2010-02-01 18:57:31

标签: python import module introspection

>>> import_path('os.path.join')
<function join at 0x22d4050>

编写import_path(Python 2.6及更高版本)的最简单方法是什么?假设 last 组件在模块/包中始终是可调用的。

3 个答案:

答案 0 :(得分:4)

这似乎是你想要的:

def import_path(name):
    modname, _, attr = name.rpartition('.')
    if not modname:
        # name was just a single module name
        return __import__(attr)
    m = __import__(modname, fromlist=[attr])
    return getattr(m, attr)

要使其适用于Python 2.5及更早版本,其中__import__不接受关键字参数,您将需要使用:

m = __import__(modname, {}, globals(), [attr])

答案 1 :(得分:0)

尝试

def import_path(name):
  (mod,mem) = name.rsplit('.',1)
  m = __import__(mod, fromlist=[mem])
  return getattr(m, mem)

至少适用于

>>> import_path('os.walk')
<function walk at 0x7f23c24f8848>

现在

>>> import_path('os.path.join')
<function join at 0x7f7fc7728a28>

答案 2 :(得分:0)

显然以下作品:

>>> p = 'os.path.join'
>>> a, b = p.rsplit('.', 1)
>>> getattr(__import__(a, fromlist=True), b)
<function join at 0x7f8799865230>