Копипаст в 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:
и копировать и вставлять материал одна из вещей, исправленных в консоли qt, вот использование простой старой копии и вставки вашего блока кода "просто работает" в новом ipython qtconsole
:
Я не знаю никакого трюка для стандартной командной строки, но я могу предложить вам более продвинутый интерпретатор, такой как оболочкой 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"
Я еще не нашел подходящего объяснения, почему это отличается от неинтерактивной сессии, увы.
все текущие ответы предлагают вам перейти на 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.ехе распознает пробелы.