Popen
デフォルトで非同期に実行されます。
Popen
オブジェクトを保存して後で照会することができます。すべてのことが必要とされているが、そのステータスは、例えば、チェックする必要があるまでp
どこかに格納することです
p = subproccess.Popen(executable)
# continue with other work
p.poll() # returns None if p is still running, returncode otherwise
p.terminate() # closes the process forcefully
p.wait() # freezes the execution until process finishes - makes it synchronous
より良い場所がない場合、開始されたプロセスのグローバルなリストで。
UPDATE
問題は、ファイルを開くPopen
にそれを与えると、処理が終了すると、すべての参照を保持せずに、ファイルを閉じる方法のようです。
これは単にスレッドで行うことができます。
def run_process(executable, filename):
with open(filename, 'w') as f:
subprocess.Popen(executable, stdout=f).wait()
Thread(target=run_process, args=(executable, filename)).start()
はそれを実行し、それを忘れ。 run_process
は、プロセスが終了してファイルを閉じるまでフリーズしますが、すべてが別のスレッドで発生します。
注:0120-djangoプロセスが終了したときにスレッドやプロセスが終了しない場合は、スレッドやプロセスに何が起こるか気にする必要はありません。
これを処理するために、覚えておくより複雑なスレッドを作成して、djangoが終了する前に停止することができます。プロセスを終了するか、完了するのを待つかもしれません...
私はそれがデフォルトで非同期に実行されます知っているが、私は意味し、何が起こりますか? –
@DylanLawrenceああ!ファイルは閉じられるまでオープンされたままになります(オープン(...)を使用しないでください)。一方、後で閉じることができるように、ファイル参照をいくらか保存しておく必要があります。 – zvone
その1つの問題は、これはウェブに面するアプリケーションなので、このスクリプトはクライアントを処理しており、サブプロセス呼び出しは基本的に「火と忘れ」です。変数を保持しないと、osはクリーンアップを処理しますか? –