如何使用 from x import y using importlib in Python
How to use from x import y using importlib in Python
我想从脚本安装并导入一个包。然后我想在那个脚本中添加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'
等等
我认为您不能直接加载方法,因为这种方法只是加载模块。一个模块加载了 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?
- 从模块内部设置模块的属性:
我想从脚本安装并导入一个包。然后我想在那个脚本中添加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'
等等
我认为您不能直接加载方法,因为这种方法只是加载模块。一个模块加载了 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?
- 从模块内部设置模块的属性: