如何在python中动态导入“import x.y.z as z”

2024-04-26 23:38:12 发布

您现在位置:Python中文网/ 问答频道 /正文

待办事项

import itertools

动态地,我可以执行以下操作

^{pr2}$

但是我应该如何动态地执行以下操作

^{3}$

问题背景:

我需要导入一个模块的不同版本(0.10)(在我的例子中是pika),安装在单独的目录中,而不是默认版本(0.9)。在

Python 2.7.6 (default, Jun 22 2015, 17:58:13)
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
Welcome to Python !!
>>> import importlib
>>> import pika
>>> pika.__version__
'0.9.14'
>>> import scale.lib.hypervisor.esx65.pika_3_5 as pika35
>>> pika35.__version__
'0.10.0'
>>> importlib.import_module('scale.lib.hypervisor.esx65.pika_3_5')
<module 'scale.lib.hypervisor.esx65.pika_3_5' from 'scale/lib/hypervisor/esx65/pika_3_5/__init__.pyc'>

正如我们所看到的,常规进口运作良好。但是,动态导入时,相对于位置导入会导致问题。根据importlib.import_module documentaion ,下面应该可以工作,但是不行

>>> importlib.import_module('pika_3_5', 'scale.lib.hypervisor.esx65')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/importlib/__init__.py", line 37, in import_module
    __import__(name)
ImportError: No module named pika_3_5

当尝试从相对路径导入“pika”时,由于相对路径下没有模块pika而失败,它仍然从默认模块导入它。在

>>> importlib.import_module('pika', 'scale.lib.hypervisor.esx65.pika_3_5')
<module 'pika' from '/usr/local/lib/python2.7/dist-packages/pika/__init__.pyc'>
>>>

我错过了什么?我主要想动态地执行以下操作。在

import scale.lib.hypervisor.esx65.pika_3_5 as pika

Tags: 模块import版本initversionlibas动态
1条回答
网友
1楼 · 发布于 2024-04-26 23:38:12

To do

import itertools

dynamically, I can do the following

import importlib
importlib.import_module('itertools')

不,请执行以下操作:

import importlib
itertools = importlib.import_module('itertools')

类似地,要复制import itertools as iters,您需要

^{pr2}$

importlib.import_module不关心您如何调用模块。as不是也不能是importlib.import_module功能的一部分。它只是给你一个模块对象;你如何称呼这个对象取决于你自己。在


至于你的背景,你误解了什么是相对重要性。importlib.import_module的第二个参数与from导入无关,importlib.import_module('thing', 'whatever')不应该等价于from whatever import thing。在

如果你愿意的话

^{3}$

那是pika = importlib.import_module('scale.lib.hypervisor.esx65.pika_3_5')。第二个参数没有进入图片。您似乎认为这不是动态的,但它和其他importlib调用一样动态。在

相关问题 更多 >