以编程方式导入模块,并使用`as`为其命名

时间:2014-04-15 21:01:50

标签: python import ipython

是否有导入实用程序(例如importlib)允许以编程方式导入具有限定名称​​的模块,例如import numpy as np

普通importlib.import_module()imp.load_module函数似乎不提供此功能。 And the Python docs page on import tools didn't reveal anything either.

具体而言,我不是仅仅执行importlib.import_module("numpy"),而是在寻找importlib.import_module("numpy", as="np")的“正常工作”,使名称"np"现在可用作导入的模块。< / p>

我的用例:

我正在使用IPython.parallel中的DirectView.sync_imports函数来确保所有计算引擎都在本地导入所需的模块。这样,用户可以在控制器IPython会话中执行代码,但后端可以并行执行。

在这个用例中,由于代码通常只是交互式的探索性脚本,因此准确匹配程序员提供的任何import语句和名称非常重要。

因此,如果以下是程序员想要映射到其他引擎并在各种参数上并行执行的函数,则需要在所有引擎上提供相同的限定导入:

def my_func(x):
    import numpy as np
    return np.random.randint(x, size=(10,1))

要同时获得4个此类结果,用户可以执行以下操作(假设已配置并运行ipclusteripcontroller / ipengines的所有内容):

from IPython.parallel import Client
rc = Client()
direct_view = rc[:]

# In parallel.
four_random_arrays = direct_view.map(my_func, [2, 3, 4, 5]).get()

IPython提供了一个很好的上下文管理器来同步导入:

# This works fine and syncs the import on all engines.
with direct_view.sync_imports():
    import numpy as np

但是假设您只能访问字符串:"numpy as np",并且您希望使用importlib在该上下文管理器块中执行此操作,而不尝试手动解析字符串并修改已加载模块dict中的任何条目。

这可能不用说了,但是在这里使用exec也是完全站不住脚的,因为如果不是模块字符串,有人会意外地传递令人讨厌或不安全的内容,就像对rm -rf /的shell调用一样。利用不允许执行任意代码的导入工具非常重要 - 使得自己无法使用自己的字符串解析exec解决方案。

1 个答案:

答案 0 :(得分:1)

import_module返回一个值(正在导入的模块) - 将您想要的任何变量设置为该值的返回值。例如:

import importlib
p = importlib.import_module('os.path')
p.join('/', 'blah')

实际上相当于

import os.path as p
p.join('/', 'blah')