Копипаст в Python интерактивный переводчик и отступы

этот кусок кода, test.py:

if 1:
   print "foo"
print "bar"

может быть успешно выполнена с execfile("test.py") или python test.py, но когда кто-то пытается скопировать-вставить его в интерпретатор python:

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

Почему это так? Может ли интерпретатор сконфигурирован таким образом, чтобы он успешно читал вставленный текст? Думаю, это может повлиять на ввод интерпретатора, но для меня это нормально.

7 ответов


отступ, вероятно, потерян или сломан.

посмотреть оболочкой IPython -- это улучшенный интерпретатор python со многими удобными функциями. Одна из них-магическая функция %paste Это позволяет вставлять несколько строк кода.

Он также имеет tab-завершение, автоматический отступ.. и многое другое. Посмотрите на их сайт.


используя %paste в ipython:

enter image description here

и копировать и вставлять материал одна из вещей, исправленных в консоли qt, вот использование простой старой копии и вставки вашего блока кода "просто работает" в новом ipython qtconsole:

enter image description here


Я не знаю никакого трюка для стандартной командной строки, но я могу предложить вам более продвинутый интерпретатор, такой как оболочкой 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 

линии продолжения необходимы при вводе многострочной конструкции. --интерактивный режим, Учебник Python (v2) (v3)

поэтому вам нужно ввести:

if 1:
   print "foo"

print "bar"

Я еще не нашел подходящего объяснения, почему это отличается от неинтерактивной сессии, увы.


Do %autoindent для автоматического отступа. после этого вы можете пройти свой код в IPython.


все текущие ответы предлагают вам перейти на IPython. Для решения только на python вы можете использовать textwrap удалить пробелы из строки.

например

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

одно другое решение, которое я недавно нашел для аналогичной проблемы:

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

EOF

Если вы похожи на меня и используете Notepad++ (для копирования и вставки),попробуйте заменить табуляцию пробелами Настройки>Настройки>Язык и проверьте замените пробелами.

У меня была эта проблема так долго, и я узнал, что python.ехе распознает пробелы.