- Чтобы этот ответ работал и с Python 3.x , print
вызывается как функция : в 3.x, только print('foo')
работает, тогда как 2.x также принимает print 'foo'
.
- Для кроссплатформенной перспективы, которая включает Windows , см. kxr полезный ответ .
In bash
, ksh
или zsh
:
Используйте ANSI C-цитируемую строку ($'...'
), которая позволяет использовать \n
для представления новых строк, которые расширяются до фактических новых строк перед передачей строки в python
python -c $'import sys\nfor r in range(10): print("rob")'
Обратите внимание на \n
между операторами import
и for
, чтобы выполнить разрыв строки.
Чтобы передать значения переменных оболочки такой команде, наиболее безопасно использовать аргументы и обращаться к ним через sys.argv
внутри скрипта Python:
name='rob' # value to pass to the Python script
python -c $'import sys\nfor r in range(10): print(sys.argv[1])' "$name"
См. Ниже обсуждение преимуществ и недостатков использования (предварительно обработанной escape-последовательности) двойных кавычек командной строки с внедренными ссылками на переменные оболочки.
Для безопасной работы с $'...'
строками:
- Double
\
экземпляров в вашем оригинальном исходном коде.
\<char>
- такие как \n
в этом случае, но также и обычные подозреваемые, такие как \t
, \r
, \b
- расширены на $'...'
(см. man printf
для поддерживаемых ускользает)
- Escape
'
экземпляры как \'
.
Если вы должны остаться POSIX-совместимым :
Использовать printf
с подстановкой команд :
python -c "$(printf %b 'import sys\nfor r in range(10): print("rob")')"
Для безопасной работы с этим типом строки:
Чтобы передать код через stdin
вместо -c
:
Примечание: я сосредотачиваюсь на однолинейных -линейных решениях здесь; ответ xorho показывает, как использовать многострочный здесь-документ - обязательно цитируйте разделитель, однако; например, <<'EOF'
, если вы явно не хотите, чтобы оболочка расширила строку вперед (что сопровождается оговорками, указанными выше).
В bash
, ksh
или zsh
:
Объедините ANSI C-цитируемую строку ($'...'
) с здесь-строкой (<<<...
):
python - <<<$'import sys\nfor r in range(10): print("rob")'
-
указывает python
явно читать из стандартного ввода (что он делает по умолчанию).
-
является необязательным в этом случае, но если вы также хотите передать аргументы в сценарии, вам это нужно для устранения неоднозначности аргумента из имени файла сценария:
python - 'rob' <<<$'import sys\nfor r in range(10): print(sys.argv[1])'
Если вы должны остаться POSIX-совместимым :
Используйте printf
, как указано выше, но с конвейером , чтобы передать свой вывод через stdin:
printf %b 'import sys\nfor r in range(10): print("rob")' | python
С аргументом:
printf %b 'import sys\nfor r in range(10): print(sys.argv[1])' | python - 'rob'