2016-10-20 5 views
0

Использование оболочки Баш на Ubuntu Linux и Python 2.7.6, если я бегу сценарий питона ниже с помощью команды,Синтаксическая ошибка в правильном сценарии питона, когда перенаправлены на стандартный ввод

python test.py 

я получаю этот выход:

outer 
inner 
2 

Если я, вместо того, чтобы использовать перенаправление стандартного ввода, как это,

python -i < test.py 

выход,

>>> outer 
>>> >>> ... ... ... File "<stdin>", line 4 
    print i 
     ^
SyntaxError: invalid syntax 
>>> 

Таким образом, ясно, что я не должен использовать опцию -i с перенаправлением оболочки, то есть с «<» характер в команде. Эта комбинация, по-видимому, приводит к некоторым манипуляциям с белым пространством, которое к тому моменту, когда python анализирует входные данные, является синтаксической ошибкой python.

К сожалению, я столкнулся с такой же проблемой при запуске сценариев python в оболочке python Django, а команда запуска оболочки Django python не имеет возможности отключить интерактивный режим python и не передавать имя файла сценария python ,

Кроме того, я считаю, что это работало на другом Linux-боксе или ранее в одном и том же ящике Linux, поэтому я задаюсь вопросом, есть ли какая-то настройка среды, которая бы исправила его.

Есть ли способ изменить поведение интерактивного режима python или есть способ отключить интерактивный режим в оболочке Django, чтобы я мог запускать общие скрипты python без ложных ошибок синтаксиса? Или я просто страдаю от ошибки в Django или python?

Кстати, эта проблема очень похожа на проблему, описанную в https://stackoverflow.com/a/13703413/2950621, но принятый ответ говорит об изменении пустых строк в скрипте. Однако мой сценарий не имеет пустых строк.

Ниже приведен сценарий python. (Я написал его флаг, когда вдавленные линии не выполняется):

print 'outer' 
i = 1 
if True: 
print 'inner' 
i = 2 
print i 

Я полагаю, что некоторые читатели могли бы подозревать скрытый характер виноват. Вот восьмеричная свалка, так что вы можете увидеть, что нет ничего, кроме того, что вы видите выше (даже не вкладка):

$ od -a test.py 
0000000 p r i n t sp ' o u t e r ' nl i sp 
0000020 = sp 1 nl i f sp T r u e : nl sp p r 
0000040 i n t sp ' i n n e r ' nl sp i sp = 
0000060 sp 2 nl p r i n t sp i nl 

ответ

1

У тебя противоположность проблемы в связанном вопросе. -i заставляет python читать сценарий в интерактивном режиме («>>>» и «...» - это подсказки), и в интерактивном режиме вы должны нажать return (т. Е. Ввести пустую строку), чтобы выйти из раздела с отступом. Связанный вопрос включал пустые строки в середине раздела с отступом, которые путали интерпретатор. У вас есть обратное: вы заканчиваете отступом раздел без пустую строку. Это нормально в неинтерактивном режиме, но в интерактивном режиме это не-нет.

Решение: либо положить пустые строки в конце отступов (и никогда не посередине), не говорите интерпретатору, чтобы прочитать его в интерактивном режиме. Я не уверен, что вы на самом деле пытаетесь выполнить с флагом -i, но обратите внимание, что python -i test.py (без переадресации) запустит скрипт в неинтерактивном режиме , а затем введите интерактивный режим и прочитайте с stdin.

+0

Абсолютно. Вот и все.Добавляя флаг -i, я связывал, чтобы имитировать способ работы оболочки Django, т. Е. Всегда в режиме «python -i» без возможности отключить его. Это также отвечает на вопрос о том, почему это сработало когда-то в прошлом. Если ваш входной скрипт либо не имеет отступов, либо разделы с отступом заканчиваются пустыми строками (это часто встречается в том, как я пишу код питона), то синтаксических ошибок нет. – nmgeek

 Смежные вопросы

  • Нет связанных вопросов^_^