Copy-paste into Python interactive interpreter and

2019-01-18 03:54发布

This piece of code, test.py:

if 1:
   print "foo"
print "bar"

can be succesfully executed with execfile("test.py") or python test.py, but when one tries to copy-paste it into python interpreter:

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

Why is it so? Can interpreter by configured in such a way that it would read copy-pasted text succesfully? I guess that may affect typing in the interpreter, but that's ok for me.

7条回答
做自己的国王
2楼-- · 2019-01-18 04:00

I don't know any trick for the standard command prompt, but I can suggest you a more advanced interpreter like IPython that has a special syntax for multi-line paste:

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

Another option is the bpython interpreter that has an automatic paste mode (if you are typing too fast to be an human):

>>> for c in range(3):
...     print c
... 
0
1
2
>>> 
 <C-r> Rewind  <C-s> Save  <F8> Pastebin  <F9> Pager  <F2> Show Source 
查看更多
仙女界的扛把子
3楼-- · 2019-01-18 04:02

All of the current answers suggest you change to IPython. For a python-only solution, you can use textwrap to remove leading whitespace from lines.

e.g.

>>> code="""    x='your pasted code'
                y='with common indentation'"""
>>> formatted=textwrap.dedent(code)
>>> exec(formatted)
查看更多
来,给爷笑一个
4楼-- · 2019-01-18 04:03

Do %autoindent to Automatic indentation OFF. after that you can past your code in IPython.

查看更多
劳资没心,怎么记你
5楼-- · 2019-01-18 04:03

One other solution I recently found for similar problem:

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

EOF
查看更多
甜甜的少女心
6楼-- · 2019-01-18 04:06

If you are like me and use Notepad++ (to copy and paste from), try to replace tabs by spaces by going to settings>preferences>language and check the replace by spaces.

I had this problem myself for so long and I found out that python.exe recognizes spaces.

查看更多
我只想做你的唯一
7楼-- · 2019-01-18 04:10

Continuation lines are needed when entering a multi-line construct. --Interactive mode, The Python Tutorial (v2) (v3)

So you need to enter:

if 1:
   print "foo"

print "bar"

I've yet to find a suitable explanation as to why it's different to a non-interactive session, alas.

查看更多
登录 后发表回答