【问题标题】:Pythonic way to import module whose name is only known at runtime? [duplicate]导入仅在运行时知道名称的模块的 Pythonic 方式? [复制]
【发布时间】:2014-11-14 12:53:22
【问题描述】:

鉴于以下文件夹结构:

executioner/:
  - executioner.py
  - library/:
    - __init__.py
    - global_functions.py
    - oakalleyit.py

如果我想访问 global_functions.py 或 Oakalleyit.py 中的函数,但直到运行时我才知道函数或模块的名称,我该怎么做?

类似:

from library import 'oakalleyit'

'oakalleyit'.'cleanup'()

'' 暗示它来自配置文件、CLI 参数等。

【问题讨论】:

  • 您的文件结构表明您正在尝试访问一个您不知道名称的 模块(两个 .py 文件之一),而不仅仅是一个函数。跨度>
  • @BrenBarn 就是这样。

标签: python dynamic python-module


【解决方案1】:

您可以使用getattr() function 动态访问名称;这包括模块对象:

import library
getattr(library, 'oakalleyit')()

hashlib 模块的演示:

>>> import hashlib
>>> getattr(hashlib, 'md5')()
<md5 HASH object @ 0x1012a02b0>
>>> getattr(hashlib, 'sha1')()
<sha1 HASH object @ 0x1012a03f0>

如果您需要动态模块访问,则需要使用importlib.import_module() function 基于字符串值导入模块:

from importlib import import_module

module = import_module('library.oakalleyit')
getattr(module, 'some_function_name')()

【讨论】:

  • 回溯(最近一次调用最后):文件“executioner.py”,第 5 行,在 getattr(library, 'oakalleyit') AttributeError: 'module' object has no attribute 'oakalleyit'
  • 不管他怎么说,他的例子表明他需要访问一个动态确定的模块,而不是一个函数。除非library 的__init__.py 自动导入其所有子模块,否则这将不起作用。
  • @BrenBarn 这行不通,“库”下的多个文件可能具有相同的功能名称,但功能不同。
  • @BrenBarn 抱歉,刚刚更正,意味着多个模块具有相同的函数名称。
  • 我认为你不能那样使用import_module。你需要做import_module('library.oakalleyit') 或import_module('.oakalleyit', 'library')。
猜你喜欢
  • 1970-01-01
  • 2023-01-26
  • 2019-09-13
  • 2023-03-02
  • 2020-04-09
  • 1970-01-01
  • 1970-01-01
  • 2012-11-15
  • 1970-01-01
相关资源
最近更新 更多