Python 从字符串变量导入模块
我正在为嵌套matplotlib(MPL)库编写文档(个人文档),它不同于感兴趣的子模块包提供的MPL。我正在编写Python脚本,希望它能从未来的MPL版本中自动生成文档。Python 从字符串变量导入模块,python,matplotlib,Python,Matplotlib,我正在为嵌套matplotlib(MPL)库编写文档(个人文档),它不同于感兴趣的子模块包提供的MPL。我正在编写Python脚本,希望它能从未来的MPL版本中自动生成文档。 我选择了感兴趣的子模块/包,并希望列出它们的主要类,我将从中生成列表,并使用pydoc 问题是我找不到一种方法来指示Python从字符串加载子模块。以下是我尝试的示例: import matplotlib.text as text x = dir(text) 以下是通过pprint对上述列表进行的三种方式比较: 我
我选择了感兴趣的子模块/包,并希望列出它们的主要类,我将从中生成列表,并使用
pydoc
问题是我找不到一种方法来指示Python从字符串加载子模块。以下是我尝试的示例:
import matplotlib.text as text
x = dir(text)
以下是通过pprint对上述列表进行的三种方式比较:
我不明白在y
对象中加载了什么-它是basematplotlib
加上其他东西,但它缺少我想要的信息,这是matplotlib.text
包中的主要类。它是屏幕截图上最上面的蓝色部分(x
list)
请不要建议使用斯芬克斯作为不同的方法。正是您想要的。它返回导入的模块。(仅适用于Python>=2.7或3.x):
此后,您可以通过
mymodule.myclass
等方式访问模块中的任何内容。导入功能可能有点难以理解
如果你改变
i = __import__('matplotlib.text')
到
然后i
将引用matplotlib.text
在Python 2.7和Python 3.1或更高版本中,可以使用importlib
:
import importlib
i = importlib.import_module("matplotlib.text")
一些注释
- 如果您试图从子文件夹导入某些内容,例如
,则代码将类似于/feature/email.py
importlib.import\u模块(“feature.email”)
- 如果您尝试导入的文件所在的文件夹中没有
,则无法导入任何内容\uuuu init\uuuuu.py
是的,对于python 2.7>您还有其他选择-但是对于2.6我开发了以下3个有用的函数:
def加载模块(moduleName):
模块=无
尝试:
导入系统
删除系统模块[moduleName]
除BaseException作为错误外:
通过
尝试:
导入导入库
module=importlib.import\u模块(moduleName)
除BaseException作为错误外:
serr=str(err)
打印(“加载模块时出错”“+moduleName+”:“+serr”)
返回模块
def重新加载模块(模块名称):
模块=加载模块(模块名称)
moduleName,modulePath=str(module).replace(“'from'”,“| |”).replace(“,”).split(“| |”)
如果(modulePath.endswith(“.pyc”):
导入操作系统
os.移除(模块路径)
模块=加载模块(模块名称)
返回模块
def getInstance(moduleName、param1、param2、param3):
模块=重新加载模块(模块名称)
实例=eval(“模块”+moduleName+“(参数1,参数2,参数3)”
返回实例
每次我想重新加载一个新实例时,我只需调用getInstance(),如下所示:
myInstance=getInstance(“MyModule”、myParam1、myParam2、myParam3)
最后,我可以调用新实例中的所有函数:
myInstance.affunction()
这里唯一的特殊性是自定义实例的参数列表(param1、param2、param3)。除了使用
importlib
外,还可以使用exec
方法从字符串变量导入模块
这里我展示了一个使用exec
方法从itertools
包导入组合
方法的示例:
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)
你能解释一下为什么你需要使用
\uuuuu import\uuuu(str)
而不是标准的import
statemetn吗?这是因为我将处理列表哪些项是MPL子模块并获取它们的方法paths@thesamet-来吧-你想要这个功能的地方有很多想法。当您具有库的文本配置时,可以按名称加载它们,这与import
语句不太兼容。这里有一个使用示例:importlib
应该可以在pypi上为/feature/email.py
)导入某些内容,那么代码将看起来像importlib.import\u模块(“feature.email”)
,最后,还请记住,如果您试图导入的文件所在的文件夹中没有\uu init\uuuuuuuuuuuuuupy
,则无法导入任何内容。@mzjn这是用于导入moduleName
的,其中moduleName是字符串。如何从moduleName import*中找到我的问题的答案?如果有人需要,请在这里找到答案。此答案@gecco中建议了一种替代方法。这是针对import moduleName
,其中moduleName是字符串。moduleName import*的怎么样?非常感谢最后一句关于如何访问导入模块的话。
i = __import__('matplotlib.text', fromlist=[''])
import importlib
i = importlib.import_module("matplotlib.text")
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 + "\n")
sys.exit(1)
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)