Как передать переменные из скрипта Python в скрипт Bash - PullRequest
11 голосов
/ 23 ноября 2010

У меня есть скрипт bash a.sh, и в нем я вызываю скрипт python b.py.Скрипт python вычисляет что-то, и я хочу, чтобы он возвращал значение, которое будет использовано позже в a.sh.Я знаю, что могу сделать

В a.sh:

var=`python b.py`

В b.py:

print x # when x is the value I want to pass

Но это не так удобно, потому что я также печатаюдругие сообщения в b.py

Есть ли лучший способ сделать это?

Редактировать:

То, что я делаю сейчас, просто

var=`python b.py | tail -n 1`

Это означает, что я могу напечатать много вещей внутри b.py, но только последняя строка (последняя команда печати, если она не содержит "\ n" в ней) будет сохранена в var.

Спасибо за все ответы!

Ответы [ 6 ]

8 голосов
/ 23 ноября 2010

Я бы распечатал его в файл, выбранный в командной строке, а затем получил бы это значение в bash с чем-то вроде cat.

Итак, вы бы пошли:

python b.py tempfile.txt
var=`cat tempfile.txt`
rm tempfile.txt

[РЕДАКТИРОВАТЬ, другая идея, основанная на других ответах]

Другой вариант - тщательно отформатировать вывод, чтобы вы могли использовать функции bash, такие как head / tail только для передачи по каналу.первые / последние строки в вашей следующей программе.

3 голосов
/ 23 ноября 2010

Я полагаю, что ответ

.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" 
1 голос
/ 03 января 2016

На 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
1 голос
/ 23 ноября 2010

В вашем скрипте Python перенаправьте другие сообщения в stderr и напечатайте x в стандартный вывод:

import sys
...
print >>sys.stderr, "another message"
print x

в скрипте bash:

...
var=`python b.py 2>/dev/null`

Также, если x является целым числом от 0,255, вы можете использовать код выхода для передачи его в bash:

import sys
...
sys.exit(x)

в bash:

python b.py
var=$?

Обратите внимание, что код выхода используется для обозначения ошибок, 0 означает отсутствие ошибок, и это нарушает соглашение.

1 голос
/ 23 ноября 2010

Я не уверен насчет "лучше", но вы могли бы записать результат в файл, затем прочитать его обратно в Bash и затем удалить его.

Это определенно ужасно, но об этом нужно помнить на случай, если больше ничего не сработает.

0 голосов
/ 23 ноября 2010

Вы можете записать вывод во временный файл, а оболочка прочитает и удалит этот файл.Это еще менее удобно, но резервирует stdout для связи с пользователем.

В качестве альтернативы вы можете использовать какой-то формат для stdout: первые n строк - это определенные переменные, остальные будут отображаться родительской оболочкойпользователю.Также не удобно, но избегает использования временных файлов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...