从IPython控制台复制代码,自动按标准Python提示重新格式化

3 投票
2 回答
789 浏览
提问于 2025-04-17 14:24

有没有办法让IPython控制台自动重新格式化复制的代码,比如:

In [131]: a = [1, 2, 3]

In [132]: a
Out[132]: [1, 2, 3]

用标准的Python提示符,也就是:

>>> a = [1, 2, 3]
>>> a
[1, 2, 3]

这样做的原因是:

  1. 行号(可能还有多余的换行)在这里没有意义。
  2. 标准格式可以直接用在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

我也会试试这个,看看能不能成功。

编辑 看起来这个方法不会立刻生效,你需要弄清楚如何在自定义魔法中访问InOut。不过我把这个答案留着,可能其他人能帮忙完善这个示例。

1

你可以设置iPython的配置,具体可以查看这篇文章的iPython部分

下面是步骤:

1. 创建配置文件

$ ipython profile create

2. 修改以下这一行,放到 ~/.config/ipython/profile_default/ipython_config.py 文件里

c.PromptManager.in_template = '>>> '

这样一来,iPython就会按照你想要的方式工作了。

撰写回答