Передача переменных bash в script?
Какой лучший способ передать переменные bash на python script. Я хотел бы сделать что-то вроде следующего:
$cat test.sh
#!/bin/bash
foo="hi"
python -c 'import test; test.printfoo($foo)'
$cat test.py
#!/bin/python
def printfoo(str):
print str
Когда я пытаюсь запустить bash script, я получаю синтаксическую ошибку:
File "<string>", line 1
import test; test.printfoo($foo)
^
SyntaxError: invalid syntax
Ответы
Ответ 1
Короче говоря, это работает:
...
python -c "import test; test.printfoo('$foo')"
...
Update:
Если вы считаете, что строка может содержать одинарные кавычки ('
), как указано в @Gordon в комментарии ниже, вы можете легко избежать этих одинарных кавычек в bash. Здесь альтернативное решение в этом случае:
...
python -c "import test; test.printfoo('"${foo//\'/\\\'}"');"
...
Ответ 2
Вы можете использовать os.getenv
для доступа к переменным среды из Python:
import os
import test
test.printfoo(os.getenv('foo'))
Однако для того, чтобы переменные окружения были переданы из Bash в любые созданные им процессы, вам необходимо экспортировать их с помощью export
builtin:
foo="hi"
export foo
# Alternatively, the above can be done in one line like this:
# export foo="hi"
python <<EOF
import os
import test
test.printfoo(os.getenv('foo'))
EOF
В качестве альтернативы использованию переменных среды вы можете просто передать параметры непосредственно в командной строке. Любые параметры, переданные Python после -c command
, загружаются в массив sys.argv
:
# Pass two arguments 'foo' and 'bar' to Python
python - foo bar <<EOF
import sys
# argv[0] is the name of the program, so ignore it
print 'Arguments:', ' '.join(sys.argv[1:])
# Output is:
# Arguments: foo bar
EOF
Ответ 3
Вам нужно использовать двойные кавычки, чтобы получить замену переменных в bash. Как и PHP.
$ foo=bar
$ echo $foo
bar
$ echo "$foo"
bar
$ echo '$foo'
$foo
Таким образом, это должно работать:
python -c "import test; test.printfoo($foo)"
Ответ 4
Сделайте это с помощью argv. Таким образом, вам не нужно импортировать его, а затем запустить его из интерпретатора.
test.py
import sys
def printfoo(string):
print string
if __name__ in '__main__':
printfoo(sys.argv[1])
python test.py testingout