复制粘贴到Python交互式解释器和缩进

pms*_*pms 15 python copy-paste indentation

这段代码,test.py:

if 1:
   print "foo"
print "bar"
Run Code Online (Sandbox Code Playgroud)

可以使用execfile("test.py")或成功执行python test.py,但是当一个人尝试将其复制粘贴到python解释器中时:

File "<stdin>", line 3
print "bar"
        ^
SyntaxError: invalid syntax
Run Code Online (Sandbox Code Playgroud)

为什么会这样?可以通过配置解释器以便成功读取复制粘贴的文本吗?我想这可能会影响口译员的输入,但这对我来说没问题.

rpl*_*lnt 18

缩进可能会丢失或损坏.

看看IPython - 它是增强的python解释器,具有许多方便的功能.其中一个是一个神奇的功能%paste,允许您粘贴多行代码.

它还有tab-completion,auto-indentation ..等等.看看他们的网站.


%paste在ipython中使用:

在此输入图像描述

复制和粘贴的东西是qt控制台中修复的东西之一,这里使用了一个简单的旧代码块复制粘贴"刚刚工作"的新东西ipython qtconsole:

在此输入图像描述

  • `ipython`,虽然很好,但也对这个示例感到厌烦:`SyntaxError:无效语法`。尝试一下! (2认同)
  • 请注意,这不是"允许你粘贴",这显然应该从选择(或可能是剪贴板)中获取代码并自动运行**,而在另一个答案中建议的`%cpaste`,有效*允许*你手动粘贴. (2认同)

nau*_*ghi 18

我不知道标准命令提示符的任何技巧,但我可以建议你使用更高级的解释器,如IPython,它具有多行粘贴的特殊语法:

In [1]: %cpaste
Pasting code; enter '--' alone on the line to stop.
:for c in range(3):
:    print c
:
:--
0
1
2
Run Code Online (Sandbox Code Playgroud)

另一种选择是bpython解释器,它具有自动粘贴模式(如果你打字太快而不能成为人类):

>>> for c in range(3):
...     print c
... 
0
1
2
>>> 
 <C-r> Rewind  <C-s> Save  <F8> Pastebin  <F9> Pager  <F2> Show Source 
Run Code Online (Sandbox Code Playgroud)


Awa*_*ais 7

%autoindent自动缩进OFF.之后,您可以通过IPython中的代码.


Joh*_*web 6

进入多线构造时需要延续线.- 交互模式,Python教程(v2)(v3)

所以你需要输入:

if 1:
   print "foo"

print "bar"
Run Code Online (Sandbox Code Playgroud)

我还没有找到一个合适的解释,为什么它与非交互式会话不同,唉.


eqz*_*qzx 5

当前所有答案都建议您更改为 IPython。对于仅限 Python 的解决方案,您可以使用textwrap删除行中的前导空格。

例如,

>>> code="""    x='your pasted code'
                y='with common indentation'"""
>>> formatted=textwrap.dedent(code)
>>> exec(formatted)
Run Code Online (Sandbox Code Playgroud)