Python:如何在交互模式下忽略前导的“>>>”和“…”?

10
许多在线 Python 示例都显示带有普通前导“>>>”和“...”字符的交互式 Python 会话。通常情况下,没有办法复制此代码而不获取这些前缀。在这种情况下,如果我想将此代码重新粘贴到自己的 Python 解释器中,则必须首先做一些工作以剥离这些前缀。是否有人知道一种方法,可以让 Python 或 iPython(或任何其他 Python 解释器)自动忽略粘贴进来的带有“>>>”和“...”前导字符的行?示例:
>>> if True:
...     print("x")
... 

1
@PadraicCunningham,然而这并不是python解释器的默认行为。IPython并未包含在Python中。 - Chris
3
没问题,但是问题中确实提到了IPython :) - bakkal
1
@Chris,我从未提到Python解释器,我所说的是ipython解释器,参考OP,“是否有人知道一种获取Python或iPython的方法...” - Padraic Cunningham
1
公正的观点,bakkal和Padraic。我错过了那个。 - Chris
1
@HippoMan - 你能给我们提供一个测试示例吗,这样我们就可以达成共识了吗?多行循环将会很有趣。我从普通的Python会话中复制/粘贴到IPython中,但它没有起作用。 - tdelaney
显示剩余3条评论
3个回答

5
IPython会自动为您完成此操作。
In [5]: >>> print("hello")
hello

In [10]: >>> print(
   ....: ... "hello"
   ....: )
hello

您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - tdelaney
好的,IPython会尝试自动缩进,所以那可能是问题所在。您可以使用%cpaste激活粘贴模式,然后使用--<enter>完成粘贴。 - Daniel Roseman

3
你只需要关闭autoindent,就可以在多行粘贴中包含>>>...
In [14]: %autoindent
Automatic indentation is: OFF
In [15]: >>> for i in range(10):
   ....: ...     pass
   ....: 

In [16]: >>> for i in range(10):
   ...: ...     pass
   ...: ... 
In [17]: >>> for i in range(10):
   ...: ...     pass
   ...: ... 

In [18]: %autoindent
Automatic indentation is: ON

In [19]: >>> for i in range(10):
   ....:     ...     pass
   ....:     
  File "<ipython-input-17-5a70fbf9a5a4>", line 2
    ...     pass
    ^
SyntaxError: invalid syntax

或者不要复制>>>,这样就能正常工作:

In [20]: %autoindent
Automatic indentation is: OFF

In [20]:  for i in range(10):
   ....: ...     pass
   ....: 

是的,在我关闭 %autoindent 后,它在 ipython 中对我有效。这已足以解决我的问题。感谢大家。 - HippoMan

2

虽然不完全与粘贴到 shell 中相同,但 doctest 模块可能很有用。它会扫描 Python 模块或常规文本文件,查找交互式脚本片段,然后运行它们。其主要用途是将文档和单元测试结合起来。假设您有一个教程,例如

This is some code to demonstrate the power of the `if`
statement. 

>>> if True:
...     print("x")
... 
x

Remember, each `if` increases entropy in the universe,
so use with care.

>>> if False:
...     print("y")
... 

将其保存到文件中,然后运行doctest
$ python -m doctest -v k.txt
Trying:
    if True:
        print("x")
Expecting:
    x
ok
Trying:
    if False:
        print("y")
Expecting nothing
ok
1 items passed all tests:
   2 tests in k.txt
2 tests in 1 items.
2 passed and 0 failed.
Test passed.

doctest 运行脚本片段并将其与期望输出进行比较。

更新

以下是一个脚本,它将获取剪贴板中的内容并粘贴回 Python 脚本片段。复制您的示例,运行此脚本,然后粘贴到 shell 中。

#!/usr/bin/env python3

import os
import pyperclip

pyperclip.copy(os.linesep.join(line[4:] 
    for line in pyperclip.paste().split(os.linesep)
    if line[:4] in ('>>> ', '... ')))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接