Я использую 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-файл.
Вы можете сделать
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 Ответ
Просто используйте возврат и введите его на следующую строку:
user@host:~$ python -c "import sys
> for r in range(10): print 'rob'"
rob
rob
...
Проблема не со счетом Импортировании
. Проблема в том, что операторы управления расходом не работают включенные в команде Python. Замените это Импорт
оператора с любым другим утверждением, и вы увидите ту же проблему.
Подумайте об этом: Python не может встроить все. Он использует отступ для группового контроля.
Проблема на самом деле не с оператором импорта, оно с чем-то, что находится перед циклом. Или более конкретно, что-либо появляется перед включенным блоком.
Например, эти все работы:
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?
Если ваша система является POSIX.2 Соответствует, что он должен поставить утилиту Printf
:
$ printf "print 'zap'\nfor r in range(3): print 'rob'" | python
zap
rob
rob
rob
этот стиль можно использовать и в 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).