Если операторы и сценарии одного сценария python из командной строки

Почему я получаю синтаксическую ошибку для следующего кода liner python?

python -c 'import re; if True: print "HELLO";' File "<string>", line 1 import re; if True: print "HELLO"; ^ SyntaxError: invalid syntax 

Следующий код работает просто отлично

 python -c 'if True: print "HELLO";' 

Как я могу изменить свою одну строку для выполнения моего намеченного сценария в одной строке из командной строки?

Один из вариантов обойти это ограничение состоит в том, чтобы указать команду с форматом $'string' , используя escape-последовательность \n .

 python -c $'import re\nif True: print "HELLO";' 

Примечание: это поддерживается оболочками, такими как bash и zsh, но недействительными POSIX sh.

Как упоминалось в @slaadvak, здесь есть несколько других способов обхода: Выполнение многострочных операторов Python в однострочной командной строке

Проблема заключается не в специфике импорта, а в том, что у вас есть что-либо перед оператором потока управления. Это не сработает:

 [email protected]:~> python -c 'a = "1234" ; if True: print "hi"' File "<string>", line 1 a = "1234" ; if True: print "hi" ^ SyntaxError: invalid syntax 

Согласно ссылке Python ( https://docs.python.org/2/reference/compound_stmts.html ), ';' может использоваться только для объединения «простых утверждений» вместе. В этом случае вы объединяете простой оператор import re , if True: if True не является простым утверждением, потому что он вводит управление потоком и поэтому является составным выражением. По крайней мере, так я интерпретирую документацию.

Вот полный текст из ссылки на Python:

Составные утверждения состоят из одного или нескольких «предложений». Предложение состоит из заголовка и «набора». Заголовки предложений конкретного составного оператора находятся на одинаковом уровне отступов. Каждый заголовок статьи начинается с уникально идентифицирующего ключевого слова и заканчивается двоеточием. Набор представляет собой группу операторов, контролируемых условием. Набор может представлять собой один или несколько простых операторов, разделенных точкой с запятой, в той же строке, что и заголовок, после двоеточия заголовка, или это может быть один или несколько выражений с отступом на последующих строках

 compound_stmt ::= if_stmt | while_stmt | for_stmt | try_stmt | with_stmt | funcdef | classdef | decorated suite ::= stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT statement ::= stmt_list NEWLINE | compound_stmt stmt_list ::= simple_stmt (";" simple_stmt)* [";"] 

Вы можете вставлять новые строки непосредственно в аргумент.

 $ python -c 'import re > if True: > print "HELLO" > ' 

Почему я получаю синтаксическую ошибку для следующего кода liner python?

Грамматика Python может запретить small_stmt ';' compound_stmt small_stmt ';' compound_stmt . -c аргумент, вероятно, интерпретируется как file_input :

 fileinput: (NEWLINE | stmt)* ENDMARKER stmt: simple_stmt | compound_stmt simple_stmt: small_stmt (';' small_stmt)* [';'] NEWLINE small_stmt: import_stmt <in this case> compound_stmt: if_stmt <in this case> 

Примечание: в конце simple_stmt . if_stmt не small_stmt он не может следовать за другим small_stmt после ';' , Новая small_stmt необходима для введения small_stmt после small_stmt .

Это не проблема, потому что bash допускает многострочные аргументы, просто не закрывайте открытую одиночную кавычку, пока вы не выполните, например:

 $ python -c ' > import re > if 1: > print(1) > ' 1 

Примечание: > здесь печатается сама оболочка. Он не вводится вручную.