79

bashスクリプトからpythonスクリプトを実行したいのですが、pythonスクリプトの出力を変数に格納したいです。

私のpythonスクリプトでは、いくつかのものを画面に出力し、最後に次の文字列を返します。

sys.exit(myString) 

私のbashスクリプトでは、次のことを行いました。

outputString=`python myPythonScript arg1 arg2 arg3 `

しかし、 の値をチェックするoutputStringecho $outputString、Python スクリプトが画面に出力したものはすべて表示されますが、戻り値は表示されませんmyString!

どうすればいいですか?

編集: Python スクリプトによって作成されたファイルの場所がわかるため、文字列が必要です。私は次のようなことをしたい:

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

6 に答える 6

62

sys.exit(myString)「この文字列を返す」という意味ではありません。に文字列を渡すとsys.exitsys.exitはその文字列をエラー メッセージと見なし、その文字列を に書き込みますstderr。プログラム全体の戻り値に最も近い概念は、整数でなければならない終了ステータスです。

stderrに書き込まれた出力をキャプチャしたい場合は、次のようにすることができます

python yourscript 2> return_file

あなたはあなたのbashスクリプトでそのようなことをすることができます

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

ただし、これは に渡された値のみをキャプチャする保証はありませんsys.exit。stderr に書き込まれたその他のものもキャプチャされます。これには、ログ出力やスタック トレースが含まれる場合があります。

例:

test.py

print "something"
exit('ohoh') 

t.sh

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

bash t.sh

編集

理由はわかりませんが、その場合は、メイン スクリプトと他の 2 つのスクリプトを作成します...本当に必要でない限り、python と bash を混在させても意味がありません。

import script1
import script2

if __name__ == '__main__':
    filename = script1.run(sys.args)
    script2.run(filename)
于 2012-08-10T11:41:02.780 に答える
26

sys.exit()文字列ではなく整数を返す必要があります。

sys.exit(1)

1は です$?

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

編集:

stderr に書き込みたい場合は、 を使用しますsys.stderr

于 2012-08-10T11:37:37.717 に答える
9

このように使用しないでくださいsys.exit。文字列引数で呼び出された場合、プロセスの終了コードは 1 になり、エラー状態を示します。エラーの内容を示すために、文字列が標準エラーに出力されます。sys.exitスクリプトに「戻り値」を提供するために使用しないでください。

代わりに、ステートメントを使用して「戻り値」を標準出力に単純に出力し、printを呼び出しsys.exit(0)て、シェルで出力をキャプチャする必要があります。

于 2012-08-10T12:35:00.863 に答える
8

ドキュメントでそれを読んでください。intまたは以外のものを返すNoneと、に出力されstderrます。

stdoutを破棄しながらstderrだけを取得するには、次のようにします。

output=$(python foo.py 2>&1 >/dev/null)
于 2012-08-10T11:55:05.677 に答える
4

Tichodroma が言ったことに加えて、次の構文を使用することになるかもしれません。

outputString=$(python myPythonScript arg1 arg2 arg3)
于 2012-08-10T11:37:48.937 に答える
4

sys.exit([arg]) の Python ドキュメントには次のように書かれています。

オプションの引数 arg は、終了ステータス (デフォルトはゼロ) を示す整数、または別のタイプのオブジェクトにすることができます。整数の場合、ゼロは「正常終了」と見なされ、ゼロ以外の値はシェルなどによる「異常終了」と見なされます。ほとんどのシステムでは、0 ~ 127 の範囲である必要があり、それ以外の場合は未定義の結果が生成されます。

さらに、最後に実行されたプログラムの戻り値を取得するには、$? bash 定義済み変数。

とにかく、sys.exit() に arg として文字列を入れると、プログラム出力の最後に別の行に出力され、少し解析するだけで取得できるようになります。例として、次のことを考慮してください。

outputString=`python myPythonScript arg1 arg2 arg3 | tail -0`
于 2012-08-10T11:49:03.110 に答える