如何检查matplotlib的pylab后端是否内联运行?

时间:2013-03-11 14:58:46

标签: python matplotlib ipython ipython-notebook

我正在修改一个使用matplotlib绘制一些特殊图形的python模块。

现在,此模块只将所有数字保存为文件。

我希望能够在ipython笔记本中工作时导入模块并查看结果“内联”,另一方面我希望保留默认功能,即在导入模块时将数字保存为文件在所有其他情况下。

所以我需要以某种方式检查模块是否在ipython笔记本中导入并且pylab是否内联运行。

我该怎么检查?

3 个答案:

答案 0 :(得分:14)

您可以使用以下命令检查matplotlib后端:

import matplotlib
matplotlib.get_backend()

特别要检查内联matplotlib:

mpl_is_inline = 'inline' in matplotlib.get_backend()

请注意,使用IPython笔记本,无论活动的matplotlib后端如何,您都可以始终显示内嵌数字:

display(fig)

答案 1 :(得分:9)

尝试怎么样:

try:
    cfg = get_ipython().config
    print('Called by IPython.')

    # Caution: cfg is an IPython.config.loader.Config
    if cfg['IPKernelApp']:
        print('Within IPython QtConsole.')

        try:
            if cfg['IPKernelApp']['pylab'] == 'inline':
                print('inline pylab loaded.')
            else:
                print('pylab loaded, but not in inline mode.')
        except:
            print('pylab not loaded.')
    elif cfg['TerminalIPythonApp']:
        try:
            if cfg['TerminalIPythonApp']['pylab'] == 'inline':
                print('inline pylab loaded.')
            else:
                print('pylab loaded, but not in inline mode.')
        except:
            print('pylab not loaded.')
except:
    print('Not called by IPython.')

答案 2 :(得分:2)

这让我搜索,我想我找到了解决方案。不确定这是实际记录的还是有意的,但它可能很有效:

get_ipython().config['IPKernelApp']['pylab'] == 'inline'

get_ipython()似乎是仅在运行IPython时定义的方法;它返回我假设的当前IPython会话。然后,您可以访问包含“IPKernelApp”元素的config属性,这是一个字典。后者本身就是一个字典,可以包含一个键pylab,它可以是字符串'inline'

我没有尝试过广泛,但我猜测如果你没有运行pylab内联,上面的代码行将评估为False。

更重要的是,当你没有运行笔记本或pylab选项时,它会引发KeyError,因此你需要捕获它并将该引发的异常作为“no”运行带有pylab内联的笔记本。< / p>

最后,get_ipython()可能会抛出一个NameError,与上面类似,当然也意味着你没有运行IPython。

我只是对它进行了最低限度的测试,但是在我的IPython笔记本中导入了这个,然后在默认的Python cmdline上显示它可以工作。

请告诉我们这是否适合您。