web-dev-qa-db-ja.com

シェルスクリプトからPython関数を呼び出す

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

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

Python=を使用して構成ファイルを読み取り、シェルで値を取得するために、これを行っています。これを実現するためのより良い方法はありますか?.

test.pyに含まれるもの:

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")

Python関数によって返される値をシェル変数に格納する必要があります。

18
user747858

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 [〜#〜]:この方法では、各関数の結果を取得するには、構成ファイルを毎回解析する必要があります。これは、次のようなすべての結果を一度に返すことで最適化できます。

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

次に、結果を分割してさまざまな変数に入れることができます

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

これはsecond結果を受け取り、それをたとえば_RESULT_BAR_に入れます(同様に、結果#nの場合は_-fn_)。

[〜#〜] pps [〜#〜]:Pablo Maurinが述べたように、可能であれば、すべてを単一のインタープリター(Python、おそらくシェルも)で実行する方がおそらく簡単です。 1つのプログラムで変数を計算し、別のプログラムでそれらを使用する方法。

28
Eric O Lebigot