2011-12-19 11 views
11

シェルスクリプトからPython関数を呼び出す方法を理解しようとしています。シェルスクリプトからPython関数を呼び出す

私は複数の関数を持つPythonファイルを持っています。私はシェルスクリプトで返された値を使用する必要があります。それを行う方法はありますか?

私はこれを、Pythonを使用して設定ファイルを読み込み、シェルで値を取得するために行っています。これを達成するための他の良い方法はありますか?

test.pyは含まれています。私はシェル変数にPythonの関数によって返された値を格納する必要が

import ConfigParser 

config = ConfigParser.ConfigParser() 
config.read("test.conf") 

def get_foo(): 
    return config.get("locations", "foo") 

def get_bar(): 
    return config.get("locations", "bar") 

+3

あなたが解決しようとしている大きな問題は何ですか?なぜ設定でスクリプトを使用して、シェルスクリプトの作業をしないのですか?あるいは、シェルから設定を読み込まないのはなぜですか?問題を2つのファイルに分割するのに十分複雑だと私は考えています。 –

答えて

22

あなたは結果を印刷するにはPythonインタプリタを尋ねることによって標準出力に自分の関数の結果を送信することができます

python -c 'import test; print test.get_foo()' 

-cオプションは、単にPythonはいくつかのPythonコマンドを実行するように求められます。

変数に結果を格納するために、あなたはそのため行うことができます。

RESULT_FOO=`python -c 'import test; print test.get_foo()'` 

や、バッククォート以来同等

RESULT=$(python -c 'import test; print test.get_foo()') 

$(…)コマンドを評価し、その出力によって、それを交換します。

PS:この方法では、各機能の結果を得るためには毎回設定ファイルを解析する必要があります。これは、のようなもので、一度にすべての結果を返すことによって最適化することができます。結果は、その後分割し、結果を取る

RESULT_BAR=$(echo $ALL_RESULTS | cut -d' ' -f2) 

と異なる変数に入れることができる

ALL_RESULTS=$(python -c 'import test; print test.get_foo(), test.get_bar()') 

たとえばRESULT_BARに入れます(同様に、結果#nの場合は-fn)。

PPS:パブロ・モーリンが述べたように、おそらく、可能な場合は、代わりに一つのプログラムで変数を計算し、別でそれらを使用して、単一のインタプリタですべてを行う方が簡単(Pythonの、多分、シェル)です1。

+0

他のpythonスクリプトに出力を送信して実行してみてください。 – sum2000

+0

いいですね。それはうまくいきました。私は疑問に思っていました。この場合.. configファイルからnパラメータを読み込むにはシェルから上記の行をn回呼び出す必要があります。これは、configparserを使って何度もPythonで読むことになります。私ができるより良い方法は何ですか? –

+1

@saddy:たとえば、両方の結果をまとめて出力し、Unixユーティリティを使って分割することができます: 'RESULT = $(import test; print test.get_foo()、test.get_bar())' '、' sed'(?)、 'awk'(?) 'RESULT2 = $(echo $ RESULT | cut -d '-f 2)'はあなたの 'get_bar()'などを返します。 – EOL

関連する問題