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