【问题标题】:Dynamically import a callable given the full module path?在给定完整模块路径的情况下动态导入可调用对象?
【发布时间】:2010-02-01 18:57:30
【问题描述】:
>>> import_path('os.path.join')
<function join at 0x22d4050>

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

【问题讨论】:

    标签: python import module introspection


    【解决方案1】:

    这似乎是你想要的:

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

    【讨论】:

      【解决方案2】:

      显然以下工作:

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

      【讨论】:

      • 我不是在滥用fromlist参数吗?
      【解决方案3】:

      试试

      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 幸运的是,它很容易解决,请参阅我的最新编辑
      猜你喜欢
      • 2022-11-30
      • 2021-10-04
      • 1970-01-01
      • 2017-06-11
      • 1970-01-01
      相关资源
      最近更新 更多