Как передать переменные из python script в bash script
У меня есть bash script, a.sh, и в нем я вызываю python script b.py.
Python script вычисляет что-то, и я хочу, чтобы он возвращал значение, которое будет использоваться позже в a.sh.
Я знаю, что могу сделать
В a.sh:
var=`python b.py`
В b.py:
print x # when x is the value I want to pass
Но это не так удобно, потому что я также печатаю другие сообщения в b.py
Есть ли лучший способ сделать это?
Edit:
То, что я сейчас делаю, это просто
var=`python b.py | tail -n 1`
Это означает, что я могу печатать много вещей внутри b.py, но только последняя строка (последняя команда печати, предполагая, что она не содержит "\n" в ней) будет храниться в var.
Спасибо за все ответы!
Ответы
Ответ 1
Я бы распечатал его в файл, выбранный в командной строке, тогда я получил бы это значение в bash с чем-то вроде cat
.
Итак, вы пойдете:
python b.py tempfile.txt
var=`cat tempfile.txt`
rm tempfile.txt
[EDIT, другая идея, основанная на других ответах]
Другой вариант - тщательно отформатировать ваш вывод, чтобы вы могли использовать функции bash, такие как head
/tail
, чтобы передать только первую/последнюю строки в следующую программу.
Ответ 2
Я считаю, что ответ
.py
import sys
a=['zero','one','two','three']
b = int(sys.argv[1])
###your python script can still print to stderr if it likes to
print >> sys.stderr, "I am no converting"
result = a[b]
print result
.sh
#!/bin/sh
num=2
text=`python numtotext.py $num`
echo "$num as text is $text"
Ответ 3
Я не уверен в "лучшем", но вы можете записать результат в файл, а затем прочитать его обратно в Bash и удалить его впоследствии.
Это определенно уродливо, но это что-то иметь в виду, если ничто другое не делает трюк.
Ответ 4
В вашем python script перенаправляйте другие сообщения в stderr и печатайте x
в stdout:
import sys
...
print >>sys.stderr, "another message"
print x
в bash script:
...
var=`python b.py 2>/dev/null`
Кроме того, если x является целым числом от 0,255, вы можете использовать код выхода, чтобы передать его в bash:
import sys
...
sys.exit(x)
в bash:
python b.py
var=$?
Обратите внимание, что код выхода используется для обозначения ошибок, 0 означает отсутствие ошибки, и это нарушает соглашение.
Ответ 5
В bash backsticks works
Я обычно делаю что-то вроде
PIP_PATH=`python -c "from distutils.sysconfig \
import get_python_lib; print(get_python_lib())"`
POWELINE_PATH=$PIP_PATH"/powerline"
echo $POWELINE_PATH
Ответ 6
Вы можете записать вывод во временный файл и заставить оболочку читать и удалять этот файл. Это еще менее удобно, но резервирует stdout для связи с пользователем.
В качестве альтернативы вы можете использовать какой-то формат для stdout: первые n строк являются определенными переменными, остальное будет отражено родительской оболочкой для пользователя. Также не удобно, но избегает использования tempfiles.
Ответ 7
В сценарии оболочки вы можете использовать это python_ret=$(python b.py)
.
Он содержит все печатные сообщения из файла Python b.py. Затем вы можете найти строку, которую вы ищете. Например, если вы ищете "Исключение", вы можете добавить это
if [[ $python_ret == *"Exception:"* ]]; then
echo "Got some exception."
exit 1
fi