web-dev-qa-db-ja.com

pythonスクリプトから値を返す最良の方法

pythonでスクリプトを作成しました。これは、いくつかのファイルを取り、いくつかのテストを実行し、それぞれの情報を含む新しいファイルを作成しながらtotal_bugsの数をカウントします(bugs + more)。

現在の作業ディレクトリからいくつかのファイルを取得するには:

myscript.py -i input_name1 input_name2

その仕事が終わったら、スクリプトに「total_bugs」を返すようにしたいと思いますが、これを実装する最善の方法はわかりません。

現在、スクリプトは次のようなものを出力します。

[working directory]
[files being opened]
[completed work for file a + num_of_bugs_for_a]
[completed work for file b + num_of_bugs_for_b]
...
[work complete]

ここで少し助けてください(注/ヒント/コード例)。

ところで、これはWindowsとUNIXで動作する必要があります。

42
ofer.sheffer

スクリプトをreturn valuesにしたい場合は、コードをラップする関数からreturn [1,2,3]を実行するだけですが、その情報を使用するには別のスクリプトからスクリプトをインポートする必要があります:

戻り値(ラッピング関数から)

(繰り返しますが、これは別のPythonスクリプトによって実行され、インポートするためにインポートする必要があります):

import ...
def main():
    # calculate stuff
    return [1,2,3]

インジケータとしての終了コード

(これは一般的に、ガバナーに何が間違っているか、または単にバグ/行のカウント数またはw/eを示す場合に適しています。通常は0が適切な終了であり、> = 1が不適切な終了です。 -データを取得したい方法でそれらを評価します)

import sys
# calculate and stuff
sys.exit(100)

そして、ガバナーに伝えたい内容に応じて、特定の終了コードで終了します。スケジューリングおよび監視環境でスクリプトを実行するときに、何が起こったかを示すために終了コードを使用しました。

リレーとしての標準出力

そうでない場合は、stdoutを使用して外の世界と通信する必要があります(説明したように)。しかし、スクリプトを実行するパーサーであり、レポートしているものをすべてキャッチできない限り、それは一般に悪い考えです。

import sys
# calculate stuff
sys.stdout.write('Bugs: 5|Other: 10\n')
sys.stdout.flush()
sys.exit(0)

制御されたスケジューリング環境でスクリプトを実行している場合、終了コードが最適な方法です。

コンベアとしてのファイル

また、単に情報をファイルに書き込み、そこに結果を保存するオプションもあります。

# calculate
with open('finish.txt', 'wb') as fh:
    fh.write(str(5)+'\n')

そしてそこから値/結果を取得します。他の人が簡単に読めるように、CSV形式で行うこともできます。

87
Torxed