Если операторы и сценарии одного сценария 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";'
Как я могу изменить свою одну строку для выполнения моего намеченного сценария в одной строке из командной строки?
- Как загружать файлы с помощью Python?
- Как запустить контекстно-зависимые команды в Python?
- pdfsplit vs pdftk, разделить pdf на куски
- Выполните несколько команд командной строки из c ++
- python cgi + веб-интерфейс для запуска командных команд?
Один из вариантов обойти это ограничение состоит в том, чтобы указать команду с форматом $'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
Примечание: >
здесь печатается сама оболочка. Он не вводится вручную.
- Какая хорошая командная структура командной строки для Python 2 и 3?
- Bash или GoogleCL: новая строка в строковом параметре
- Сценарий командной строки Python: автозаполнение файла / каталога при вводе пользователя
- Почему нет <работы для чтения в файле из командной строки (простой код Python)?
- sys.stdin не закрывается на ctrl-d
- Запустите sqlite3 с помощью python в командной строке
- Как определить, был ли запущен скрипт Python через командную строку?
- Сохранять историю команд между (i) сеансами python
- Странная ошибка вызова java-программы из python через командную строку