使用“__import__”从字符串变量导入模块与普通导入语句产生不同的结果
- 2024-12-13 08:37:00
- admin 原创
- 101
问题描述:
我正在编写嵌套 matplotlib (MPL) 库的文档(个人),该库与 MPL 自己提供的库不同,由感兴趣的子模块包提供。我正在编写 Python 脚本,希望它能够自动生成未来 MPL 版本的文档。
我选择了感兴趣的子模块/包,并想要列出它们的主要类,从中我将生成列表并用它进行处理pydoc
。
问题是我找不到一种方法来指示 Python 从字符串加载子模块。以下是我尝试的示例:
import matplotlib.text as text
x = dir(text)
i = __import__('matplotlib.text')
y = dir(i)
j = __import__('matplotlib')
z = dir(j)
以下是通过 pprint 对上述列表进行的三向比较:
我不明白y
对象中加载了什么 - 它是基础matplotlib
加上其他东西,但它缺少我想要的信息,即来自包的主要类。它是屏幕截图(列表)matplotlib.text
顶部的蓝色部分。x
解决方案 1:
该__import__
功能可能有点难以理解。
如果你改变
i = __import__('matplotlib.text')
到
i = __import__('matplotlib.text', fromlist=[''])
然后i
将参考matplotlib.text
。
在 Python 3.1 或更高版本中,您可以使用importlib
:
import importlib
i = importlib.import_module("matplotlib.text")
一些注释
如果你尝试从子文件夹导入某些内容
./feature/email.py
,则代码将如下所示importlib.import_module("feature.email")
在 Python 3.3 之前,如果文件夹中没有
__init__.py
您要导入的文件,则您将无法导入任何内容(在决定是否要保留该文件以实现向后兼容之前,请参阅注意事项,pytest
例如)。
解决方案 2:
importlib.import_module
就是你要找的。它返回导入的模块。
import importlib
# equiv. of your `import matplotlib.text as text`
text = importlib.import_module('matplotlib.text')
此后您可以访问模块中的任何内容text.myclass
,如text.myfunction
、等。
解决方案 3:
花了一些时间尝试从列表中导入模块,这是帮助我完成大部分工作的线程 - 但我不明白 import_ 的用法 -
因此,以下是如何从字符串导入模块,并获得与导入相同的行为。还有 try/except 错误情况。:)
pipmodules = ['pycurl', 'ansible', 'bad_module_no_beer']
for module in pipmodules:
try:
# because we want to import using a variable, do it this way
module_obj = __import__(module)
# create a global object containging our module
globals()[module] = module_obj
except ImportError:
sys.stderr.write("ERROR: missing python module: " + module + "
")
sys.exit(1)
是的,对于 python 2.7> 您还有其他选择 - 但对于 2.6<,这是有效的。
解决方案 4:
除了使用之外,importlib
还可以使用exec
方法从字符串变量导入模块。
这里我展示了使用该方法combinations
从itertools
包中导入方法的一个例子exec
:
MODULES = [
['itertools','combinations'],
]
for ITEM in MODULES:
import_str = "from {0} import {1}".format(ITEM[0],', '.join(str(i) for i in ITEM[1:]))
exec(import_str)
ar = list(combinations([1, 2, 3, 4], 2))
for elements in ar:
print(elements)
输出:
(1, 2)
(1, 3)
(1, 4)
(2, 3)
(2, 4)
(3, 4)
解决方案 5:
您还可以使用exec
内置函数将任何字符串作为 Python 代码执行。
In [1]: module = 'pandas'
...: function = 'DataFrame'
...: alias = 'DF'
In [2]: exec(f"from {module} import {function} as {alias}")
In [3]: DF
Out[3]: pandas.core.frame.DataFrame
对我来说,这是解决我的问题最易读的方法。
解决方案 6:
模块自动安装并从列表导入
下面的脚本可以很好地与子模块和伪子模块配合使用。
# PyPI imports
import pkg_resources, subprocess, sys
modules = {'lxml.etree', 'pandas', 'screeninfo'}
required = {m.split('.')[0] for m in modules}
installed = {pkg.key for pkg in pkg_resources.working_set}
missing = required - installed
if missing:
subprocess.check_call([sys.executable, '-m', 'pip', 'install', '--upgrade', 'pip'])
subprocess.check_call([sys.executable, '-m', 'pip', 'install', *missing])
for module in set.union(required, modules):
globals()[module] = __import__(module)
测试:
print(pandas.__version__)
print(lxml.etree.LXML_VERSION)
解决方案 7:
我开发了以下 3 个有用的功能:
def loadModule(moduleName):
module = None
try:
import sys
del sys.modules[moduleName]
except BaseException as err:
pass
try:
import importlib
module = importlib.import_module(moduleName)
except BaseException as err:
serr = str(err)
print("Error to load the module '" + moduleName + "': " + serr)
return module
def reloadModule(moduleName):
module = loadModule(moduleName)
moduleName, modulePath = str(module).replace("' from '", "||").replace("<module '", '').replace("'>", '').split("||")
if (modulePath.endswith(".pyc")):
import os
os.remove(modulePath)
module = loadModule(moduleName)
return module
def getInstance(moduleName, param1, param2, param3):
module = reloadModule(moduleName)
instance = eval("module." + moduleName + "(param1, param2, param3)")
return instance
每次我想要重新加载一个新实例时,我只需要像这样调用 getInstance():
myInstance = getInstance("MyModule", myParam1, myParam2, myParam3)
最后我可以调用新实例中的所有函数:
myInstance.aFunction()
这里唯一的特殊性是自定义实例的参数列表(param1、param2、param3)。
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 项目管理必备:盘点2024年13款好用的项目管理软件
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)