Как передать переменные из 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