python:忽略前导&燃气轮机&燃气轮机&燃气轮机&引用;及&引用;在交互模式下?

python:忽略前导&燃气轮机&燃气轮机&燃气轮机&引用;及&引用;在交互模式下?,python,ipython,interpreter,pasting,Python,Ipython,Interpreter,Pasting,许多联机python示例显示了交互式python会话,每行前面都有正常的前导“>>>”和“…”字符 通常,如果没有这些前缀,就无法复制此代码 在这些情况下,如果我想在复制后将这些代码重新粘贴到我自己的python解释器中,我必须做一些工作,首先去掉这些前缀 有没有人知道如何让python或iPython(或任何其他python解释器)自动忽略粘贴行上的前导“>>>”和“…”字符 例如: >>> if True: ... print("x") ... IPython将

许多联机python示例显示了交互式python会话,每行前面都有正常的前导“>>>”和“…”字符

通常,如果没有这些前缀,就无法复制此代码

在这些情况下,如果我想在复制后将这些代码重新粘贴到我自己的python解释器中,我必须做一些工作,首先去掉这些前缀

有没有人知道如何让python或iPython(或任何其他python解释器)自动忽略粘贴行上的前导“>>>”和“…”字符

例如:

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

IPython将自动为您执行此操作

In [5]: >>> print("hello")
hello

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

您只需关闭
自动缩进
即可在多行粘贴中包括
>>
..

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

与粘贴到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 ('>>> ', '... ')))

@但是,这不是
python
解释器中的默认行为。是的,但是op在问题中提到了IPython:)@Chris,我从来没有提到Python解释器,我说的是IPython解释器引用op,有人知道获取Python或IPython的方法吗?公平点bakkal和Padraic。“我错过了。”希波曼-你能给我们举个例子来测试一下吗,这样我们就都在同一页上了?多行for循环会很有趣。我从一个常规python会话剪切/粘贴到ipython,但它不起作用。我尝试了一个
for
循环(多行等效于
for I in range(10):pass
),但它不起作用。我在“pass”中遇到了一个SystaxError。好吧,IPython将尝试自动为您缩进,所以这可能就是问题所在。您可以执行
%cpaste
以激活粘贴模式,然后执行
--
以完成粘贴。是。现在我关闭了%自动缩进,在ipython中它对我很有效。这就足以解决我的问题了。谢谢大家。
#!/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 ('>>> ', '... ')))