subprocess.call()
はargs
パラメータとして文字列または文字列の配列を期待する - ドキュメントhereを参照してください。
あなたが提供している:としてPythonによって解釈される
subprocess.call(pgrep -f "detectmotion.py")
、:
- が変数
pgrep
の値を取り、および減算をf
- 文字列 "detectmotion.py"
Wh
subprocess.call([ 'pgrep', '-f', 'detectmotion.py'])
この配列の各項目は、次のプロセスの引数として使用されます。 pgrep
は、実行するバイナリを示します(新しいプロセスではarg 0として表示されます)。 -f
とdetectmotion.py
は次の引数です。
ランタイムを取得する場合は、同じことをもう一度やり直してください。 - 次のような簡単な修正があります。
subprocess.call(['ps', '-o', 'etime=', '-p', detectmotion_file_pid ])
最後の問題は、あなたがsubprocess.call()
の戻り値はあなたが後にしているデータであることを期待しているということです。実際には、subprocess.call()
は:
returncode属性を返します。物事が取得する場所
あなたはちょうど走ったコマンドの出力をキャッチしたい場合は、あなたがあなたのアプリケーションにコマンドの出力をもたらすために、「パイプ」を使用する必要がありますが、これはあります乱雑には、ドキュメントは言う:
注:それは子プロセスの出力ボリュームに基づいてデッドロックすることができますようは、この機能を標準出力= PIPEまたはstderr = PIPEを使用しないでください。パイプが必要な場合は、communicate()
メソッドでPopen
を使用できます。
So ...
x = subprocess.Popen([ 'pgrep', '-f', 'detectmotion.py'])
out, _ = x.communicate()
# out is currently a string, e.g: '26585\n'
print(out)
# convert it into an integer:
detectmotion_file_pid = int(out.rstrip())
これはあなたの人間が読める形式で時刻を返しますようあなたは、ps -o etime= -p ...
の出力と似た何かをする必要があります。この時点で
x = subprocess.Popen(['ps', '-o', 'etime=', '-p', str(detectmotion_file_pid) ])
out, _ = x.communicate()
# out is currently a string, e.g: ' 12:53\n'
print(out)
# strip it
out = out.strip()
# now it's free of white-space, e.g: '12:53'
print(out)
、あなたは残念ながらps
の出力は、人間のために設計された、おそらくにひどく単純ではありません...どのようにもっと便利なものに一見mm:ss
フォーマットを変換するために自分自身を頼むかもしれませんこのように解析する。
あなたはあなたのプロセスに関する情報のすべての種類を伝えることができ、/proc/[pid]/stat
に見えることを好むかもしれません:
@Attie更新参照してください。 – John