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

时间:2011-10-10 11:57:59

标签: python indentation copy-paste

这段代码,test.py:

if 1:
   print "foo"
print "bar"

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

File "<stdin>", line 3
print "bar"
        ^
SyntaxError: invalid syntax

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

8 个答案:

答案 0 :(得分:18)

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

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

另一种选择是具有自动粘贴模式的bpython解释器(如果你输入的速度太快而无法成为人类):

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

答案 1 :(得分:17)

缩进可能会丢失或损坏。

查看IPython - 它是具有许多便捷功能的增强型python解释器。其中一个是魔术函数%paste,允许您粘贴多行代码。

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


在ipython中使用%paste

enter image description here

复制和粘贴内容是qt控制台中修复的内容之一,这里使用了新代码ipython qtconsole中的代码块“只是工作”的简单复制粘贴:

enter image description here

答案 2 :(得分:7)

%autoindent设置为自动缩进OFF。之后你可以在IPython中通过你的代码。

答案 3 :(得分:6)

  

输入多线构造时需要延续线。    - Interactive modeThe Python Tutorial(v2)(v3

所以你需要输入:

if 1:
   print "foo"

print "bar"

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

答案 4 :(得分:1)

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

e.g。

>>> code="""    x='your pasted code'
                y='with common indentation'"""
>>> formatted=textwrap.dedent(code)
>>> exec(formatted)

答案 5 :(得分:1)

我最近针对类似问题发现了另一个解决方案:

$ python << EOF
if 1:
   print "foo"
print "bar"

EOF

答案 6 :(得分:0)

如果您像我一样使用Notepad ++(要复制和粘贴),尝试按空格替换标签,请转到设置&gt;偏好设置&gt;语言并检查替换为空格。

我自己有这个问题已经很久了,我发现python.exe可以识别空格。

答案 7 :(得分:0)

如果粘贴的内容有任何空行,则解释器在遇到它们时会触发评估。如果空行后的任何行都有缩进,则将导致IndentationError,因为任何先前的上下文都已关闭。

解决方案:

  • 删除所有空行,然后复制到剪贴板。
  • 在复制到剪贴板之前,在空行中添加任意数量的缩进(不需要匹配代码)。

请注意,空格与制表符似乎无关紧要。