3

モジュールを使用してsubprocess、プロセスが実行されているかどうかを確認しています。ただし、検索するプロセスが存在しない場合、結果は異なります。

たとえば、シェルでは、プロセスpython test.pyが存在しない場合、の出力ps -ef|grep python|grep test|awk '{print $2}'は空です。しかし、Pythonでは:

cmd="ps -ef|grep python|grep test|awk '{print $2}'"
vp=subprocess.Popen(cmd,stdout=subprocess.PIPE,shell=True)
r=vp.communicate()[0]

出力rはNoneではありません。を実行しているシェルのpidですcmd

では、どのようにして望ましい結果を得るのでしょうか?

4

1 に答える 1

4

シェルサブプロセスの実行中は、引数がpsコマンドラインとしてに渡されるため、その引数はに表示されshます。

shell=Trueを呼び出すことによって動作し['/bin/sh', '-c', cmdstring]ます。

シェルにパイプラインを入力すると、パイプラインの各部分が個別に呼び出されるため、引数に「python」と「test」の両方を含むプロセスはありません。

プロセスツリーは次のようになります。

python script.py
    /bin/sh -c "ps -ef|grep python|grep test|awk '{print $2}'"
        ps -ef
        grep python
        grep test
        awk '{print $2}'
于 2012-06-15T10:06:22.230 に答える