Ipython - c.InteractiveShellApp.pylab和c.TerminalIPythonApp.pylab有什么区别?

时间:2016-08-17 11:00:29

标签: matplotlib ipython

出于某种原因,在ipython3 / ipython中运行以下代码时,我无法进行绘图。窗口会弹出,但会保持灰色。

$ ipython

import matplotlib
matplotlib.get_backend()
# TKAgg

plt.plot(range(10))
plt.show()
# this works!
# Close the window with alt+f4 to get the command line back

plt.ion()
plt.plot(range(10))
# this doesn't work and the plot window freezes (not the terminal)
# Close the frozen window
plt.close()

为了解决这个问题,我改为运行以下内容:

ipython --pylab

现在所有上面的代码都有效,所以我开始寻找一种自动加载的方法。所以我查看了我的默认ipython配置文件配置文件(~/.ipython/profile_default/ipython_config.py),我在搜索matplotlib时找到了两个代码块:

# Pre-load matplotlib and numpy for interactive use, selecting a particular
# matplotlib backend and loop integration.
# c.InteractiveShellApp.pylab = None

# Pre-load matplotlib and numpy for interactive use, selecting a particular
# matplotlib backend and loop integration.
# c.TerminalIPythonApp.pylab = None

所以我取消注释c.IntractiveShellApp.pylab并将其设置为'auto'并且一切正常但我不确定我应该更改哪两个参数以及它们之间有什么区别!

1 个答案:

答案 0 :(得分:0)

我同意这些配置选项有点令人困惑,人们可能无法立即掌握差异,因为在配置的评论中没有解释它,而且描述相当模糊。他们没有明确地解决这个问题,这真是令人惊讶。事实上,我在阅读这个问题之前已经在c.TerminalIPythonApp.exec_lines中有几行,但我不记得为什么我把它们放在那里而不是InteractiveShellApp对应的。

假设你有IPython 3.x或更低

评论给了我们一个提示。在InteractiveShellApp部分下面写着:

  

用于启动InteractiveShell个实例的应用程序的Mixin。

通过一系列链接浏览后,我已经到达了 IPython 1.x 的文档页面(不知道他们为什么会从未来版本中删除该页面)在online IPython documentation中:

  

可以为任何启动InteractiveShell的应用程序设置一些选项,例如扩展和启动代码。这些应用是InteractiveShellApp的子类。由于子类继承配置,因此设置c.InteractiveShellApp的特征将影响所有IPython应用程序,但如果您希望终端IPython和QtConsole具有不同的值,则可以通过c.TerminalIPythonAppc.IPKernelApp设置它们分别

最后,请在配置文件的TerminalIPython部分考虑此评论:

  

TerminalIPythonApp将继承以下内容的配置:BaseIPythonApplicationApplicationInteractiveShellApp

底线:据我了解,InteractiveShellApp适用于使用IPython API的其他应用,而TerminalIPythonApp仅适用于直接运行IPython(但不一定在交互模式下,ipython script.py也会从中读取配置设置)。前者在某种意义上更广泛,因为后者继承了它的设置。

为了给你一个简单的例子,考虑在常规Python shell下运行它:

>>> from IPython.core.interactiveshell import InteractiveShell
>>> InteractiveShell()
<IPython.core.interactiveshell.InteractiveShell object at 0x7fb4a5bee890>
In : 

所以,我想如果您只是计划直接使用IPython(而不是作为图书馆),那就不要为InteractiveShellApp而烦恼。

较新版本的IPython

我没有在附近安装任何设备,所以不能肯定地说,但是在&#34; The Big Split&#34;他们可能已经改变了很多设置。如果没有,我相信同样的逻辑适用。

PS 忘了提及我一般性地写过InteractiveShellAppTerminalIPythonApp之间的差异,但我希望它也能回答你的具体问题。