Выполнение многострочных операторов в короткой командной строке?

Я использую Python с -c выполнить цикл остроты, т.е.:

$ python -c "for r in range(10): print 'rob'"

Это хорошо работает. Однако, если я импортирую модуль перед для цикла, я получаю синтаксическую ошибку:

$ python -c "import sys; for r in range(10): print 'rob'"
  File "<string>", line 1
    import sys; for r in range(10): print 'rob'
              ^
SyntaxError: invalid syntax

Какая-либо идея, как это может быть зафиксировано?

Для меня важно иметь это как остроту так, чтобы я мог включать его в Make-файл.

177
задан martineau 16 April 2019 в 21:36
поделиться

6 ответов

- 3823471-

Вы можете сделать

echo -e "import sys\nfor r in range(10): print 'rob'" | python

или трубы с W / OUT:

python -c "exec(\"import sys\nfor r in range(10): print 'rob'\")"

или

(echo "import sys" ; echo "for r in range(10): print 'rob'") | python

или @ Ответ Silenghost / @ Crast's Ответ

162
ответ дан 23 November 2019 в 20:19
поделиться

Просто используйте возврат и введите его на следующую строку:

user@host:~$ python -c "import sys
> for r in range(10): print 'rob'"
rob
rob
...
12
ответ дан 23 November 2019 в 20:19
поделиться

Проблема не со счетом Импортировании . Проблема в том, что операторы управления расходом не работают включенные в команде Python. Замените это Импорт оператора с любым другим утверждением, и вы увидите ту же проблему.

Подумайте об этом: Python не может встроить все. Он использует отступ для группового контроля.

9
ответ дан 23 November 2019 в 20:19
поделиться

Проблема на самом деле не с оператором импорта, оно с чем-то, что находится перед циклом. Или более конкретно, что-либо появляется перед включенным блоком.

Например, эти все работы:

python -c "import sys; print 'rob'"
python -c "import sys; sys.stdout.write('rob\n')"

Если импорт является утверждением, было проблемой, это будет работать, но он не работает:

python -c "__import__('sys'); for r in range(10): print 'rob'"

для вашего самого основного примера, вы можете переписать его как это:

python -c "import sys; map(lambda x: sys.stdout.write('rob%d\n' % x), range(10))"

Однако лямбдас может выполнять только выражения, а не заявления или несколько утверждений, поэтому вы все равно можете сделать то, что вы хотите сделать. Однако между выражениями генератора, пометки списка, LAMBDAS, SYS.STDOUT.WRITE, «карта» встроена и некоторая творческая интерполяция строки, вы можете сделать некоторые мощные одноистовые вкладыши.

Вопрос в том, как вы хотите пойти, и в какой момент не лучше написать .py файл, который вместо этого выполняет ваш Makefile?

48
ответ дан 23 November 2019 в 20:19
поделиться

Если ваша система является POSIX.2 Соответствует, что он должен поставить утилиту Printf :

$ printf "print 'zap'\nfor r in range(3): print 'rob'" | python
zap
rob
rob
rob
7
ответ дан 23 November 2019 в 20:19
поделиться

этот стиль можно использовать и в makefiles (и на самом деле он используется довольно часто).

python - <<EOF
import sys
for r in range(3): print 'rob'
EOF

или

python - <<-EOF
    import sys
    for r in range(3): print 'rob'
EOF

в последнем случае удаляются и ведущие символы табуляции (и можно добиться некоторой структурированности)

вместо EOF может стоять любое маркерное слово, не встречающееся в документе here в начале строки (см. также документы here в manpage bash или here).

83
ответ дан 23 November 2019 в 20:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: