11

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

现在,这个模块只是将所有图形保存为文件。

我想让在 ipython notebook 中工作时导入模块并查看结果“内联”成为可能案例。

所以我需要以某种方式检查模块是否已导入 ipython notebook 并且 pylab 是否内联运行。

我怎样才能检查这个?

4

3 回答 3

18

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

import matplotlib
matplotlib.get_backend()

特别要检查内联 matplotlib:

mpl_is_inline = 'inline' in matplotlib.get_backend()

请注意,使用 IPython 笔记本,无论活动的 matplotlib 后端如何,您始终可以显示内联图形,其中:

display(fig)
于 2013-03-11T19:17:37.570 回答
11

试试呢:

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.')
于 2013-07-24T06:13:03.383 回答
2

这让我开始搜索,我想我已经找到了解决方案。不确定这是否实际记录或什至是有意的,但它可能非常有效:

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

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

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

更重要的是,当您不运行笔记本或 pylab 选项时,它会引发 KeyError,因此您需要捕捉到该异常并将引发的异常视为“否”以运行带有 pylab 内联的笔记本。

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

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

让我们知道这是否适合您。

于 2013-03-11T17:49:01.727 回答