如何使用 from x import y using importlib in Python

How to use from x import y using importlib in Python

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

等等

我认为您不能直接加载方法,因为这种方法只是加载模块。一个模块加载了 import module,我定义为 "A module is a file containing Python definitions and statements. The file name is the module name with the suffix .py appended. "(检查 documentation). from x import y does also do the import module but sets another namespace (see discussion here)。你可以做的是加载你的模块,然后手动设置你的命名空间,这就是 from x import y syntax 所做的。您可以使用路径加载模块(在此示例中,我想从 pandas 加载 read_csv):

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

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

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

对应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 * 函数,您必须遍历模块的属性并将它们分配给命名属性。这里有两个提示可以帮助您实现目标:

  • How to list all functions in a Python module?
  • 从模块内部设置模块的属性: