73

いくつかのファイルを取り、いくつかのテストを実行し、total_bugs の数を数えながら、それぞれの情報 (バグ + その他) を含む新しいファイルを作成するスクリプトを Python で作成しました。

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

myscript.py -i 入力名1 入力名2

その作業が完了したら、スクリプトで「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 で動作する必要があります。

4

1 に答える 1

129

スクリプトが値を返す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)

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

os._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 形式にすることもできます。

コンベアとしてのソケット

上記のいずれも機能しない場合は、ローカルでネットワーク ソケットを使用することもできます *(UNIX ソケットは、NIX システムでは優れた方法です)。これらはもう少し複雑で、独自の投稿/回答に値します。ただし、プロセス間で通信するための適切なオプションであるため、編集してここに追加します。特に、複数のタスクを実行して値を返す必要がある場合。

于 2013-08-14T12:14:18.390 に答える