如何在Python中使用importlib模块的from x import y语法

13

我想在脚本中安装和导入一个包,然后我想在那个脚本中添加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'

etc.


1
我认为你需要将其分配给一个变量,就像你在全局变量中所做的那样:mod=importlib.import_module('gtts','gTTS'),然后使用类似于mod.gTTS(args)的方式来调用它。 - jottbe
是的,我这样做了。见[package]。它意味着导入的数据名称。而我写global是因为我正在制作一个函数。 - Ratul Hasan
2个回答

5
“与mischva11的答案相对应的确切语法如下:”
tempmod = importlib.import_module("x_mymodule")
y = x_mymodule.y
del tempmod  # optionally delete the reference to the parent module

只从模块x_mymod中导入属性y,类似于“from x_mymodule import y”。您可以通过在第二行代码中将其分配给任何名称来获得“... as z”功能。当在子模块中使用时,我发现将父模块从命名空间中删除很有用,以防止混乱。我认为要获取“import *”函数,您需要遍历模块的属性并将它们分配给命名属性。以下是两个提示,可帮助您实现此目标:

5
我认为你不能直接加载方法,因为这个方法只会加载模块。使用import module来加载模块,"模块是包含Python定义和语句的文件。文件名是模块名称加上后缀.py"(请参阅文档)。from x import y也会执行import module,但会设置另一个命名空间(请参见此处的讨论)。你可以先加载你的模块,然后手动设置你的命名空间,这就是from x import y语法所做的。你可以通过路径加载模块(在这个例子中我想从pandas加载read_csv):
importlib.import_module(".io.parsers", "pandas")

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

同时,像 jottbe 在评论中提到的解决方案也是可行的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接