如何动态导入 `import x.y.z as z`in python

How to dynamically import `import x.y.z as z`in python

要做

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'>

正如我们所见,常规导入工作正常。但是,当动态导入时,相对于位置导入会导致问题。根据 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

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,您需要

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 调用一样动态。