Скопировать-вставить в 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

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

Ответы

Ответ 1

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

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

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


Использование %paste в ipython:

enter image description here

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

enter image description here

Ответ 2

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

Ответ 3

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

Итак, вам нужно ввести:

if 1:
   print "foo"

print "bar"

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

Ответ 4

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

Ответ 5

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

например.

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

Ответ 6

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

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