要做
import itertools
动态地,我可以执行以下操作
import importlib
importlib.import_module('itertools')
但我该怎么办才能动态地执行以下操作
import itertools as iters
问题背景:
我需要导入一个模块的不同版本(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'>
我们可以看到常规进口正常运转。但是,在动态导入时,相对于该位置的导入会导致问题。根据{{3}},以下内容应该有效,但事实并非如此。
>>> 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'时,由于相对路径下没有模块鼠标,它应该会失败,它仍然从默认模块导入它。
>>> 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
答案 0 :(得分:1)
要做
import itertools
动态地,我可以执行以下操作
import importlib importlib.import_module('itertools')
不,您执行以下操作:
import importlib
itertools = importlib.import_module('itertools')
同样,要复制import itertools as iters
,您需要
import importlib
iters = importlib.import_module('itertools')
importlib.import_module
并不关心你所谓的模块。 as
不是,也不能成为importlib.import_module
功能的一部分。它只是给你模块对象;你所说的那个对象取决于你。
至于你的背景,你误解了相对导入是什么。 importlib.import_module
的第二个参数与from
导入无关,而importlib.import_module('thing', 'whatever')
不应与from whatever import thing
等效。
如果你想做
import scale.lib.hypervisor.esx65.pika_3_5 as pika
那是pika = importlib.import_module('scale.lib.hypervisor.esx65.pika_3_5')
。第二个参数没有进入图片。您似乎认为这不是动态的,但它与任何其他importlib调用一样动态。