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

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

在Python 2.6及以上版本中,写入import_path的最简单方法是什么?假设模块/包的最后组件始终是可调用的。
3个回答

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])

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>

@sridhar 幸运的是,绕过这个问题很容易,可以看看我的最新编辑。 - Geoff Reedy

0

显然以下代码可以正常工作:

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

我没有滥用 fromlist 参数吧? - Sridhar Ratnakumar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接