【问题标题】:Ipython - What is the difference between c.InteractiveShellApp.pylab and c.TerminalIPythonApp.pylab?Ipython - c.InteractiveShellApp.pylab 和 c.TerminalIPythonApp.pylab 有什么区别?
【发布时间】:2016-08-17 11:00:29
【问题描述】:

由于某种原因,在 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' 并且一切正常,但我不确定我应该更改两个参数中的哪一个以及有什么区别!

【问题讨论】:

    标签: matplotlib ipython


    【解决方案1】:

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

    假设您有 IPython 3.x 或更低版本

    评论给我​​们一个提示。在InteractiveShellApp 部分它说:

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

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

    可以为任何启动InteractiveShell 的应用程序设置一些选项,例如扩展和启动代码。这些应用程序是InteractiveShellApp 的子类。由于子类继承配置,设置c.InteractiveShellApp trait 将影响所有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

    我附近没有安装任何这些,所以不能肯定,但在“大分裂”之后,他们可能已经改变了很多设置。如果不是,我相信同样的逻辑也适用。

    PS忘了提到我已经写过关于InteractiveShellAppTerminalIPythonApp 之间区别的一般性文章,但我希望它也能回答你的具体问题。

    【讨论】:

      猜你喜欢
      • 2012-09-04
      • 1970-01-01
      • 2021-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-02
      • 2011-12-12
      • 2010-09-16
      相关资源
      最近更新 更多