如何在Python中使用importlib从x import y使用

时间:2019-07-05 12:19:54

标签: python python-3.x pip package python-import

我想从脚本安装和导入软件包。然后我想在该脚本中添加from x import yfrom x import *(我实际上是在做一些功能)

我已成功使用subprocessimportlib安装和导入。但是我对from x import yfrom x import *不知所措。尝试了这些代码和其他一些代码。

globals()[package] = importlib.import_module('package','class')
globals()[package] = importlib.import_module('class','package')
globals()[package] = importlib.import_module('package','*')
globals()[package] = importlib.import_module('*','package')
importlib.import_module('gtts','gTTS')
importlib.import_module('gtts','*')

但是他们没有用。显示:

NameError: name 'gTTS' is not defined
ModuleNotFoundError: No module named 'gTTS'

2 个答案:

答案 0 :(得分:1)

我认为您不能直接加载方法,因为此方法仅加载模块。模块加载了import module,并且我定义为“模块是包含Python定义和语句的文件。文件名是带有后缀.py的模块名称。”(选中documentation)。 from x import y确实也执行import module,但是设置了另一个名称空间(请参见讨论here)。您可以做的是加载模块,然后手动设置名称空间,这就是from x import y syntax的作用。您可以使用路径加载模块(在本示例中,我想从熊猫加载read_csv):

importlib.import_module(".io.parsers", "pandas")

(用print(inspect.getmodule(read_csv).__name__)检查路径)

评论中提到的jottbe这样的解决方案也是可能的

答案 1 :(得分:1)

与mischva11的答案相对应的确切语法如下:

tempmod = importlib.import_module("x_mymodule")
y = x_mymodule.y
del tempmod  # optionally delete the reference to the parent module

仅从模块y中导入属性x_mymod,类似于from x_mymodule import y。您可以通过将其分配给第二行代码中所需的任何名称来获得... as z功能。

当在子模块中使用父模块时,我发现将其从名称空间中删除非常有用,以免造成名称空间混乱。

我认为要获得import *函数,您必须遍历模块的属性并将它们分配给命名属性。这里有两个提示可以帮助您到达目的地: