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

将粘贴复制到Python交互式解释器和缩进中,python,indentation,copy-paste,Python,Indentation,Copy Paste,这段代码,文件test.py 可以使用execfile(“test.py”)或python test.py成功执行,但当尝试将其复制粘贴到python解释器中时: File "<stdin>", line 3 print "bar" ^ SyntaxError: invalid syntax 文件“”,第3行 打印“条” ^ SyntaxError:无效语法 为什么会这样?解释器是否可以配置为能够成功读取复制粘贴的文本 我想这可能会影响在解释器中的输入,但对我来说

这段代码,文件test.py

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

File "<stdin>", line 3
print "bar"
        ^
SyntaxError: invalid syntax
文件“”,第3行
打印“条”
^
SyntaxError:无效语法
为什么会这样?解释器是否可以配置为能够成功读取复制粘贴的文本


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

缩进可能丢失或损坏

看看——它是一个增强的Python解释器,具有许多方便的特性。其中之一是一个神奇的函数
%paste
,它允许您粘贴多行代码

它也有制表符完成,自动缩进。。。还有更多。看看他们的网站


在IPython中使用
%paste

复制和粘贴内容是Qt控制台中固定的内容之一。这里使用的是在新IPython qtconsole中“正常工作”的代码块的普通旧拷贝和粘贴:


我不知道标准命令提示符有什么诀窍,但我可以向您推荐一个更高级的解释器,它有一个用于多行粘贴的特殊语法:

In [1]: %cpaste
Pasting code; enter '--' alone on the line to stop.
:for c in range(3):
:    print c
:
:--
0
1
2
另一个选项是具有自动粘贴模式的解释器(如果您键入的速度太快,无法成为人类):

范围(3)内的c的
>:
...     打印c
... 
0
1.
2.
>>> 
倒带保存粘贴箱寻呼机显示源
输入多行构造时需要连续行。 --,(v2)()

因此,您需要输入:

if 1:
   print "foo"

print "bar"

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

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

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

比如说,

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

如果您像我一样使用(从中复制和粘贴),请转到“菜单设置”,尝试用空格替换选项卡→ 偏好→ 语言并检查替换为空格


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

我最近为类似问题找到了另一个解决方案:

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

EOF

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

解决方案:

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

请注意,空格和制表符似乎并不重要。

ipython
,尽管如此,这个示例中也出现了一些错误:
SyntaxError:invalid syntax
。试试看@约翰西韦布我在windows ATM,粘贴似乎根本不起作用(使用tkinter_剪贴板)。所以我真的不能尝试。但是@naufraghi的答案中提到的
%cpaste
即使在这个例子中也能很好地工作。@Johnsyweb适合我,请参见我的编辑中添加的例子。但是,我有一个ipython的最新版本,我知道这是过去明确指出的。请注意,这不允许“粘贴”,这显然是为了从选择中获取代码(或者可能是剪贴板)并自动运行,而另一个答案中建议的
%cpaste
,有效地允许您手动粘贴。对于多行粘贴,Linux和Windows也有。+1:我被困在一个块后多次错过换行符,从未找到一个令人满意的解释,解释为什么它不同于非交互式会话。这就是问题所在,实际上,这就是我现在使用python的风格,正因为如此,我需要在我正在处理的源文件(以及通过复制粘贴进行测试)中放入空行。。。这很令人恼火,但对上面的例子不起作用,也许是因为@Johnsywebyes指出的原因,我已经注意到了这一点,但对我的源代码进行复制粘贴测试是我现在的python工作风格,这件事迫使我到处放冗余的空行……这很奇怪,as-IMHO-我们希望使用shebang行运行的文本能够以与发送到解释器的stdin相同的方式运行。@Johnsyweb-单元测试是一种方法,但有时您使用的是难以进行单元测试的遗留系统,或者是在没有单元测试支持的较旧Python版本上运行的基础结构(就像运行在jython 2.2上的wlst脚本一样。)这是一个解决方案,不需要使用任何像IPython这样的工具(虽然我认为这是一个非常好的工具),但这只适用于之后添加的内容,而不是现有的内容?关键是“用空格替换制表符”。这适用于任何编辑器。这不是粘贴到python中
>>> code="""    x='your pasted code'
                y='with common indentation'"""
>>> formatted=textwrap.dedent(code)
>>> exec(formatted)
$ python << EOF
if 1:
   print "foo"
print "bar"

EOF