Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从字符串变量导入模块_Python_Matplotlib - Fatal编程技术网

Python 从字符串变量导入模块

Python 从字符串变量导入模块,python,matplotlib,Python,Matplotlib,我正在为嵌套matplotlib(MPL)库编写文档(个人文档),它不同于感兴趣的子模块包提供的MPL。我正在编写Python脚本,希望它能从未来的MPL版本中自动生成文档。 我选择了感兴趣的子模块/包,并希望列出它们的主要类,我将从中生成列表,并使用pydoc 问题是我找不到一种方法来指示Python从字符串加载子模块。以下是我尝试的示例: import matplotlib.text as text x = dir(text) 以下是通过pprint对上述列表进行的三种方式比较: 我

我正在为嵌套matplotlib(MPL)库编写文档(个人文档),它不同于感兴趣的子模块包提供的MPL。我正在编写Python脚本,希望它能从未来的MPL版本中自动生成文档。
我选择了感兴趣的子模块/包,并希望列出它们的主要类,我将从中生成列表,并使用
pydoc

问题是我找不到一种方法来指示Python从字符串加载子模块。以下是我尝试的示例:

import matplotlib.text as text
x = dir(text)

以下是通过pprint对上述列表进行的三种方式比较:

我不明白在
y
对象中加载了什么-它是base
matplotlib
加上其他东西,但它缺少我想要的信息,这是
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)