Подтвердить что ты не робот

Сохранить возвращаемое значение Python script в bash script

Я хочу выполнить python script из bash script, и я хочу сохранить вывод python script в переменной.

В моем python script я печатаю некоторые материалы для экрана, а в конце возвращаю строку с помощью:

sys.exit(myString) 

В моем bash script я сделал следующее:

outputString=`python myPythonScript arg1 arg2 arg3 `

Но тогда, когда я проверю значение outputString на echo $outputString, я получаю все, что Python script напечатал на экране, но не возвращаемое значение myString!

Как мне это сделать?

EDIT: Мне нужна строка, потому что это говорит мне, где находится файл, созданный Python script. Я хочу сделать что-то вроде:

fileLocation=`python myPythonScript1 arg1 arg2 arg1`
python myPythonScript2 $fileLocation
4b9b3361

Ответ 1

http://docs.python.org/library/sys.html#sys.exit

sys.exit будет записываться в stderr, если вы используете строковые аргументы.

Сделайте что-то вроде

python yourscript 2> return_file

Bash script - хранить stderr в переменной

Вы можете сделать что-то подобное в script

output=$((your command here) 2> &1)

Пример:

test.py

print "something"
exit('ohoh') 

t.sh

va=$(python test.py 2>&1)                                                                                                                    
mkdir $va

bash t.sh

изменить

Не знаю, почему, но в этом случае я бы написал основной script и два других скрипта... Смешивание python и bash бессмысленно, если вам действительно не нужно.

import script1
import script2

if __name__ == '__main__':
    filename = script1.run(sys.args)
    script2.run(filename)

Ответ 2

sys.exit() должно возвращать целое число, а не строку:

sys.exit(1)

Значение 1 находится в $?.

$ cat e.py
import sys
sys.exit(1)
$ python e.py
$ echo $?
1

Edit:

Если вы хотите написать stderr, используйте sys.stderr.

Ответ 3

Не используйте sys.exit, как это. Когда вызывается с строковым аргументом, код выхода вашего процесса будет 1, сигнализируя об ошибке. Строка печатается со стандартной ошибкой, чтобы указать, что может быть ошибкой. sys.exit не используется для предоставления "возвращаемого значения" для вашего script.

Вместо этого вы должны просто напечатать "возвращаемое значение" до стандартного вывода с помощью оператора print, затем вызвать sys.exit(0) и захватить вывод в оболочке.

Ответ 4

прочитайте его в docs. Если вы вернете что-либо, кроме int или None, оно будет напечатано на stderr.

Чтобы получить только stderr при отбрасывании stdout:

output=$(python foo.py 2>&1 >/dev/null)

Ответ 5

Документация Python для sys.exit([arg]) говорит:

Необязательный аргумент arg может быть целым числом, дающим статус выхода (по умолчанию - ноль) или другой тип объекта. Если это целое число, нуль считается "успешным завершением", и любое ненулевое значение считается "аномальным завершением" оболочками и тому подобное. Большинство систем требуют, чтобы оно находилось в диапазоне 0-127, и в противном случае создавайте результаты undefined.

Кроме того, чтобы получить возвращаемое значение последней выполненной программы, вы можете использовать $? bash предопределенная переменная.

В любом случае, если вы поместите строку в качестве аргумента в sys.exit(), она должна быть напечатана в конце вывода вашей программы в отдельной строке, чтобы вы могли получить ее просто с небольшим разбором. В качестве примера рассмотрим это:

outputString=`python myPythonScript arg1 arg2 arg3 | tail -0`

Ответ 6

В дополнение к тому, что сказал Тиходрома, вы можете использовать этот синтаксис:

outputString=$(python myPythonScript arg1 arg2 arg3)

Ответ 7

Вы ответили на свой вопрос. Если вы хотите запустить Python script из bash и сохранить результат в переменной bash, будьте избирательны в том, что печатает ваш Python script.

Сделайте флаг "verbose", который вы можете отключить в своем Python script, чтобы подавить дополнительный текст, который вы не хотите хранить в вашей переменной bash. Не принимайте участие в написании допустимого вывода на stderr или переопределении кодов выхода! (что плохие дети делают...)

Попробуйте что-то вроде этого:

fileLocation=`python myPythonScript1 arg1 arg2 arg1 --verbose off`