我正在修改一个使用 matplotlib 绘制一些特殊图形的 python 模块。
现在,这个模块只是将所有图形保存为文件。
我想让在 ipython notebook 中工作时导入模块并查看结果“内联”成为可能案例。
所以我需要以某种方式检查模块是否已导入 ipython notebook 并且 pylab 是否内联运行。
我怎样才能检查这个?
我正在修改一个使用 matplotlib 绘制一些特殊图形的 python 模块。
现在,这个模块只是将所有图形保存为文件。
我想让在 ipython notebook 中工作时导入模块并查看结果“内联”成为可能案例。
所以我需要以某种方式检查模块是否已导入 ipython notebook 并且 pylab 是否内联运行。
我怎样才能检查这个?
您可以使用以下命令检查 matplotlib 后端:
import matplotlib
matplotlib.get_backend()
特别要检查内联 matplotlib:
mpl_is_inline = 'inline' in matplotlib.get_backend()
请注意,使用 IPython 笔记本,无论活动的 matplotlib 后端如何,您始终可以显示内联图形,其中:
display(fig)
试试呢:
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.')
这让我开始搜索,我想我已经找到了解决方案。不确定这是否实际记录或什至是有意的,但它可能非常有效:
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 上确实显示它可以工作。
让我们知道这是否适合您。