从IPython控制台复制代码,自动按标准Python提示重新格式化
有没有办法让IPython控制台自动重新格式化复制的代码,比如:
In [131]: a = [1, 2, 3]
In [132]: a
Out[132]: [1, 2, 3]
用标准的Python提示符,也就是:
>>> a = [1, 2, 3]
>>> a
[1, 2, 3]
这样做的原因是:
- 行号(可能还有多余的换行)在这里没有意义。
- 标准格式可以直接用在doctest中。
有趣的是,IPython的Qt控制台提供了“复制”和“复制(原始文本)”这两个选项,而“复制”的默认行为会得到以下结果:
a = [1, 2, 3]
a
Out[132]: [1, 2, 3]
显然,某种自动重新格式化是可以实现的。那么,有没有办法自定义这个功能呢?
我知道有一个叫PromptManager
的东西,可以用来定制显示的提示符(例如,http://nb.nathanamy.org/2012/09/terminal-productivity/)。不过,带有行号的IPython提示符在交互式会话中很有用。我只想让复制的版本重新格式化一下。
2 个回答
0
我不知道有没有现成的方法可以做到这一点,不过你可以试着自己定义一个“魔法”函数来解决这个问题。
你可以参考一下文档,里面有关于如何定义和注册自定义魔法的说明,然后试试下面的代码:
from IPython.core.magic import (register_line_magic, register_cell_magic,
register_line_cell_magic)
@register_line_magic
def export_prompt(start, end):
"Exporting input and output within given limits"
for i in range(start, end):
in_ = In.get(i)
out_ = Out.get(i)
print in_
print out_
# We delete this to avoid name conflicts for automagic to work
del export_prompt
我也会试试这个,看看能不能成功。
编辑
看起来这个方法不会立刻生效,你需要弄清楚如何在自定义魔法中访问In
和Out
。不过我把这个答案留着,可能其他人能帮忙完善这个示例。
1
你可以设置iPython的配置,具体可以查看这篇文章的iPython部分。
下面是步骤:
1. 创建配置文件
$ ipython profile create
2. 修改以下这一行,放到 ~/.config/ipython/profile_default/ipython_config.py 文件里
c.PromptManager.in_template = '>>> '
这样一来,iPython就会按照你想要的方式工作了。