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

问题描述 投票:0回答:9

这段代码,文件test.py

if 1:
   print "foo"
print "bar"

可以使用

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

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

为什么会这样?解释器可以配置为成功读取复制粘贴的文本吗?

我想这可能会影响在解释器中输入,但这对我来说没关系。

python indentation copy-paste
9个回答
28
投票

压痕可能丢失或损坏。

看看 IPython——它是一个增强的 Python 解释器,具有许多方便的功能。其中之一是一个神奇的功能

%paste
,它允许您粘贴多行代码。

它还有制表符补全、自动缩进……等等。看看他们的网站。


在 IPython 中使用

%paste

Enter image description here

复制粘贴功能是 Qt 控制台中修复的功能之一。这里使用的是代码块的普通旧复制粘贴,它在新的 IPython qtconsole 中“正常工作”:

Enter image description here


20
投票

我不知道标准命令提示符的任何技巧,但我可以建议您使用更高级的解释器,例如 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 

10
投票

执行

%autoindent
以关闭自动缩进。之后,您可以将代码粘贴到 IPython 中。


8
投票
输入多行结构时需要连续行。 --

交互模式Python 教程 (v2) (v3)

所以你需要输入:

if 1: print "foo" print "bar"

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


5
投票
当前所有答案都建议您更改为IPython。对于仅限 Python 的解决方案,您可以使用

textwrap 删除行中的前导空格。

例如,

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

2
投票
如果粘贴的内容有空行,解释器遇到空行时会触发评估。如果空行后面的任何行有缩进,则会导致

IndentationError

,因为任何先前的上下文都已关闭。

解决方案:

    复制到剪贴板之前删除所有空行。
  • 在复制到剪贴板之前,向空行添加任意数量的缩进(不需要匹配代码)。
请注意,空格与制表符似乎并不重要。


1
投票
如果您像我一样使用

Notepad++(从中复制和粘贴),尝试通过转到菜单设置首选项语言并检查用空格替换来用空格替换制表符

我自己也遇到这个问题很久了,我发现python.exe可以识别空格。


-1
投票
exec(pyperclip.paste())
前提是您不介意使用

exec

。我猜除了 
pyperclip
 以外的任何其他第三方剪贴板包都可以。


-2
投票
我最近发现的类似问题的另一个解决方案:

$ python << EOF if 1: print "foo" print "bar" EOF
    
© www.soinside.com 2019 - 2024. All rights reserved.