Скопируйте и вставьте в Python интерактивный интерпретатор и отступ - PullRequest
15 голосов
/ 10 октября 2011

Этот фрагмент кода, 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 ]

18 голосов
/ 10 октября 2011

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

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

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

Она также имеет завершение табуляции, авто-отступ ... и многое другое.Взгляните на их сайт.


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

enter image description here

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

enter image description here

7 голосов
/ 30 марта 2015

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

6 голосов
/ 10 октября 2011

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

Так что вам нужно ввести:

if 1:
   print "foo"

print "bar"

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

1 голос
/ 27 июня 2018

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

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

EOF
1 голос
/ 19 сентября 2017

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

, например

>>> code="""    x='your pasted code'
                y='with common indentation'"""
>>> formatted=textwrap.dedent(code)
>>> exec(formatted)
0 голосов
/ 18 октября 2017

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...