web-dev-qa-db-ja.com

サブプロセスをバックグラウンドで実行

私はpythonスクリプトを入力として受け取り、それをサーバー上の別のスクリプトを呼び出すコマンドにフォーマットし、サブプロセスを使用して実行します:

import sys, subprocess

thingy = sys.argv[1]

command = 'usr/local/bin/otherscript.pl {0} &'.format(thingy)
command_list = command.split()
subprocess.call(command_list)

&は実行に時間がかかるため、最後にotherscript.plを追加し、バックグラウンドで実行することを好みます。ただし、スクリプトはシェルに制御を戻さずに実行されているように見え、実行が終了してプロンプトに戻るまで待機する必要があります。 subprocessを使用してスクリプトをバックグラウンドで完全に実行する別の方法はありますか?

11
dbishop

_&_はシェル機能です。 subprocessで動作させる場合は、次のように_Shell=True_を指定する必要があります。

_subprocess.call(command, Shell=True)
_

これにより、バックグラウンドでコマンドを実行できます。

ノート:

  1. _Shell=True_なので、上記では_command_list_ではなくcommandを使用します。

  2. _Shell=True_を使用すると、シェルのすべての機能が有効になります。 commandを含むthingyが信頼できるソースからのものでない限り、これを行わないでください。

より安全な代替手段

この代替方法でも、コマンドをバックグラウンドで実行できますが、デフォルトの_Shell=False_を使用するため安全です。

_p = subprocess.Popen(command_list)
_

このステートメントが実行された後、コマンドはバックグラウンドで実行されます。完了したことを確認したい場合は、p.wait()を実行します。

19
John1024

バックグラウンドで実行する場合は、通常ターミナルに送られるNohup出力を使用して、Nohup.outというファイルに移動することをお勧めします。

import subprocess

subprocess.Popen("Nohup usr/local/bin/otherscript.pl {0} >/dev/null 2>&1 &", Shell=True)

>/dev/null 2>&1 &は出力を作成せず、バックグラウンドにリダイレクトします

2
cucliura