代码之家  ›  专栏  ›  技术社区  ›  Sridhar Ratnakumar

根据完整的模块路径动态导入可调用文件?

  •  3
  • Sridhar Ratnakumar  · 技术社区  · 15 年前
    >>> import_path('os.path.join')
    <function join at 0x22d4050>
    

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

    3 回复  |  直到 13 年前
        1
  •  4
  •   Thomas Wouters    13 年前

    这似乎是你想要的:

    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)
    

    为了使它能与Python2.5及更早版本一起工作,其中 __import__ 不接受关键字参数,需要使用:

    m = __import__(modname, {}, globals(), [attr])
    
        2
  •  0
  •   Sridhar Ratnakumar    15 年前

    显然,以下作品:

    >>> p = 'os.path.join'
    >>> a, b = p.rsplit('.', 1)
    >>> getattr(__import__(a, fromlist=True), b)
    <function join at 0x7f8799865230>
    
        3
  •  0
  •   Geoff Reedy    15 年前

    尝试

    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>