如何在 Python 中动态导入类似于 "import X from Y" 语法的模块?
How do I dynamically import a module similar to the "import X from Y" syntax in Python?
我正在努力实现:
from X import Y
其中 Y 是仅在运行时才知道的模块的字符串名称。
我试过使用
module = importlib.import_module(Y, X)
但这不起作用。我也不知道模块的路径,因为它仅在运行时存在于模块 Brownie 中,之后会被删除。
非常感谢帮助。
你几乎明白了,除了 import_module
的第二个参数是包名,而不是你想要的属性。当你想要一个模块的属性时,你必须先 运行 整个模块的代码,因为 python 无法提前预测哪些行会产生副作用。
所以首先导入模块:
X = importlib.import_module('X')
然后需要从模块中获取属性:
Y = getattr(module, 'Y')
当然你可能不想创建临时变量X
,所以你可以这样做
Y = getattr(importlib.import_module('X'), 'Y')
有时我使用pydoc.locate
函数来实现同样的效果。主要是因为它允许安全导入任何 python 实体,包括模块。
奇怪的是我很难找到文档 - 在线文章没有提到它(pydoc for reference), but it however it does exist in the source: https://github.com/python/cpython/blob/3.10/Lib/pydoc.py#L1714
幸运的是它非常易于使用:
>>> from pydoc import locate
>>> locate('django')
<module 'django' from '\env\lib\site-packages\django\__init__.py'>
它可以导入任何东西,例如模块 到 父模块。
>>> locate('short.views.base')
<module 'short.views.base' from 'short\views\base.py'>
A class 来自模块:
>>> locate('short.views.base.ShortMixin')
<class 'short.views.base.ShortMixin'>
本机模块或通过本地引用:
>>> locate('os')
<module 'os' from '\Python\Python38\lib\os.py'>
>>> locate('.')
<module 'builtins' (built-in)>
>>> locate('globals')
<built-in function globals>
或者一个函数——甚至是目标模块中 class 的本地导入和未绑定函数:
>>> locate('short.views.base.ShortMixin.get_template_names')
<function ShortMixin.get_template_names at 0x0000000003C3C160>
我正在努力实现:
from X import Y
其中 Y 是仅在运行时才知道的模块的字符串名称。
我试过使用
module = importlib.import_module(Y, X)
但这不起作用。我也不知道模块的路径,因为它仅在运行时存在于模块 Brownie 中,之后会被删除。
非常感谢帮助。
你几乎明白了,除了 import_module
的第二个参数是包名,而不是你想要的属性。当你想要一个模块的属性时,你必须先 运行 整个模块的代码,因为 python 无法提前预测哪些行会产生副作用。
所以首先导入模块:
X = importlib.import_module('X')
然后需要从模块中获取属性:
Y = getattr(module, 'Y')
当然你可能不想创建临时变量X
,所以你可以这样做
Y = getattr(importlib.import_module('X'), 'Y')
有时我使用pydoc.locate
函数来实现同样的效果。主要是因为它允许安全导入任何 python 实体,包括模块。
奇怪的是我很难找到文档 - 在线文章没有提到它(pydoc for reference), but it however it does exist in the source: https://github.com/python/cpython/blob/3.10/Lib/pydoc.py#L1714
幸运的是它非常易于使用:
>>> from pydoc import locate
>>> locate('django')
<module 'django' from '\env\lib\site-packages\django\__init__.py'>
它可以导入任何东西,例如模块 到 父模块。
>>> locate('short.views.base')
<module 'short.views.base' from 'short\views\base.py'>
A class 来自模块:
>>> locate('short.views.base.ShortMixin')
<class 'short.views.base.ShortMixin'>
本机模块或通过本地引用:
>>> locate('os')
<module 'os' from '\Python\Python38\lib\os.py'>
>>> locate('.')
<module 'builtins' (built-in)>
>>> locate('globals')
<built-in function globals>
或者一个函数——甚至是目标模块中 class 的本地导入和未绑定函数:
>>> locate('short.views.base.ShortMixin.get_template_names')
<function ShortMixin.get_template_names at 0x0000000003C3C160>