我想从脚本安装和导入软件包。然后我想在该脚本中添加from x import y
和from x import *
。(我实际上是在做一些功能)。
我已成功使用subprocess
和importlib
安装和导入。但是我对from x import y
和from 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'
等
答案 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 *
函数,您必须遍历模块的属性并将它们分配给命名属性。这里有两个提示可以帮助您到达目的地: