reload(sys)导致后续执行丢失`Out [n]:`标记

时间:2015-09-12 08:49:37

标签: python ipython

我刚刚注意到这种与ipython shell的交互使用有关的特殊行为。我认为以下示例非常简单,可以证明我的意思:

调用新的ipython会话;执行以下语句,注意Out[n]:语句后reload(sys)标记丢失。

In [1]: import sys

In [2]: 1
Out[2]: 1

In [3]: reload(sys)
<module 'sys' (built-in)>

In [4]: 1
1

版本信息是Python 2.7.10和IPython 2.4.1,Fedora 22。

这是CPython和/或IPython的错误吗?如果没有,为什么会出现这种情况?

2 个答案:

答案 0 :(得分:2)

答案在于ipython的sys.displayhook,它与系统版本不同。来自help(sys)

Dynamic objects:

[...]

displayhook -- called to show results in an interactive session

执行reload(sys)后,它会提取系统的sys版本,而非ipython版本,因此它没有修补版本:

In [1]: import sys

In [2]: print sys.displayhook
<IPython.core.displayhook.DisplayHook object at 0x105bc1dd0>

In [3]: reload(sys)
<module 'sys' (built-in)>

In [4]: print sys.displayhook
<built-in function displayhook>

您可以在ipython代码库中的core/displayhook.py中看到它的代码。如果你真的在乎,你甚至可以解决它:

In [1]: import sys

In [2]: print sys.displayhook
<IPython.core.displayhook.DisplayHook object at 0x10ba2ddd0>

In [3]: dh = sys.displayhook

In [4]: reload(sys)
<module 'sys' (built-in)>

In [5]: print sys.displayhook
<built-in function displayhook>

In [6]: 2
2

In [7]: sys.displayhook = dh

In [8]: 2
Out[8]: 2

答案 1 :(得分:1)

IPython使用sys.ps1 value作为输入提示,为输出添加 sys.ps3。要在输出工作中显示sys.ps3,已设置sys.displayhook

  在评估在交互式Python会话中输入的表达式的结果上调用

sys.displayhook。可以通过为sys.displayhook指定另一个单参数函数来自定义这些值的显示。

重新加载将重置重置为默认None

重置为:

from IPython import get_ipython
get_ipython().display_trap.set()

这比预先存储DisplayHook实例更方便。