相关文章推荐
不拘小节的米饭  ·  Tutorial: ML ...·  7 小时前    · 
愤怒的豆芽  ·  python ...·  2 小时前    · 
伤情的红豆  ·  读取rtf文件python - CSDN文库·  2 小时前    · 
健壮的茶壶  ·  python读取hdf4文件-CSDN博客·  1小时前    · 
道上混的稀饭  ·  python读hdf文件 ...·  1小时前    · 

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

26 人关注

This piece of code, file test.py ,

if 1:
   print "foo"
print "bar"

可以用execfile("test.py")python test.py成功执行,但当人们试图把它复制粘贴到Python解释器中时。

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

为什么会这样?解释器的配置方式能否使其成功地读取复制粘贴的文本?

我想这可能会影响到在解释器中的打字,但对我来说是可以的。

2 个评论
+1:我曾多次因为错过了区块后的换行而被逮个正着,但从未找到一个令人满意的解释,即为什么它与非交互式会话不同。
pms
这就是问题所在,实际上这就是我现在使用Python的工作方式,正因为如此,我需要在我正在工作的源文件中加入空行(并通过复制粘贴进行测试)......这很令人恼火。
python
indentation
copy-paste
pms
pms
发布于 2011-10-10
9 个回答
rplnt
rplnt
发布于 2021-09-04
已采纳
0 人赞同

压痕可能已经丢失或断裂。

请看一下 IPython -- 它是一个增强的Python解释器,具有许多方便的功能。其中之一是一个神奇的函数 %paste ,允许你粘贴多行代码。

It also has tab-completion, auto-indentation... and many more. 请看一下their site.

Using %paste in IPython:

而复制和粘贴的东西是Qt控制台中固定的东西之一。下面是使用一个普通的老式的复制和粘贴你的代码块,在新的版本中 "刚刚好"。 IPython qtconsole :

替换代码0】,很好,在这个样本上也是巴掌大的。 SyntaxError: invalid syntax 。试试吧!
@Johnsyweb 我在windows ATM上, %paste 似乎根本不能工作(与tkinter_clipboard有关)。所以我不能真的尝试。但是@naufraghi的回答中提到的 %cpaste 即使在这个例子中也能正常工作。
wim
@Johnsyweb 对我有用,见我编辑中添加的例子。 然而,我有一个相当新的ipython版本,我知道这是在过去肯定被破坏的东西。
njsg
请注意,这不是 "允许你粘贴",这显然是要从选择(或可能是剪贴板)中抓取代码并运行它。 自动地 而另一个答案中提出的 %cpaste ,实际上是指 允许 你要手动粘贴。
对于多行粘贴,也有 梦想派 用于Linux和Windows。
naufraghi
naufraghi
发布于 2021-09-04
0 人赞同

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

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

另一个选择是bpython解释器,它有一个自动粘贴模式(如果你打字的速度太快,不像是人)。

>>> for c in range(3):
...     print c
 <C-r> Rewind  <C-s> Save  <F8> Pastebin  <F9> Pager  <F2> Show Source 
    
对上面的例子不起作用,也许是因为@Johnsyweb指出的原因。
Awais
Awais
发布于 2021-09-04
0 人赞同

%autoindent 来进行自动缩进 off .之后,你可以在IPython中粘贴你的代码。

ipython --no-autoindent 的情况下,最初会出现偏差。
johnsyweb
johnsyweb
发布于 2021-09-04
0 人赞同

当输入一个多行结构时,需要续行。 -- 互动模式 , Python教程 (v2) ( v3 )

So you need to enter:

if 1:
   print "foo"
print "bar"

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

pms
是的,我注意到了这一点,但是复制粘贴测试我的源代码是我现在的Python工作方式,而这个东西让我不得不把多余的空行放在所有地方......
njsg
这很奇怪,因为--IMHO--人们期望使用shebang行运行的文本与发送到解释器stdin的文本运行方式略有不同。
@Johnsyweb - 单元测试是一种方式,但有时你与难以进行单元测试的遗留系统合作,或者与运行在没有单元测试支持的旧Python版本上的基础设施合作(比如运行在jython 2.2上的wlst脚本。)
这就是不使用任何像IPython这样的工具的解决方案(尽管我认为那是一个非常好的工具)。
eqzx
eqzx
发布于 2021-09-04
0 人赞同

目前所有的答案都建议你改用IPython。对于只用Python的解决方案,你可以使用 文字包装 来删除行中的前导空白。

>>> code="""    x='your pasted code'
                y='with common indentation'"""
>>> formatted=textwrap.dedent(code)
>>> exec(formatted)
    
如果你只是在 code=''' 之后添加一个新行,你可以跳过dedent的调用。
Flavio Rajta
Flavio Rajta
发布于 2021-09-04
0 人赞同

如果你像我一样,使用 记事本++ (来复制和粘贴的)。 尝试用空格代替制表符 by going to menu Settings Preferences 语言 并检查用空格替换的情况。

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

但这只适用于那之后添加的内容,而不是现有内容?
关键是 "用空格替换制表符"。这适用于任何编辑器。
Vic
Vic
发布于 2021-09-04
0 人赞同

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

Solutions:

  • Delete any empty lines before copying to clipboard.
  • Add any amount of indentation to empty lines (doesn't need to match code) before copying to clipboard.
  • 请注意,空格与制表符似乎并不重要。

    patentfox
    patentfox
    发布于 2021-09-04
    0 人赞同

    我最近还发现了一个解决类似问题的办法。

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