回答:
subprocess
モジュールでパイプを使用するには、を渡す必要がありますshell=True
。
ただし、これはさまざまな理由で実際にはお勧めできません。特にセキュリティがその理由です。代わりに、ps
とgrep
プロセスを別々に作成し、次のように出力を一方から他方にパイプします。
ps = subprocess.Popen(('ps', '-A'), stdout=subprocess.PIPE)
output = subprocess.check_output(('grep', 'process_name'), stdin=ps.stdout)
ps.wait()
あなたの特定のケースでは、しかし、簡単な解決策は呼び出すことですsubprocess.check_output(('ps', '-A'))
当時とstr.find
出力に。
shell=True
subprocess.CalledProcessError: Command '('grep', 'process_name')' returned non-zero exit status 1
単にgrepで何も見つからなかったことを意味するので、これは正常な動作です。
ps.wait()
すでに出力があるのに、なぜfor が必要なのですか。ps.wait.__doc__
は子が終了するのを待ちますが、子の内容はすでにoutput
変数に入れられているようです
string.find
の賛成で廃止されました、str.find
(すなわち、法find
上のstr
オブジェクト)。
grep
早期に死亡した場合。ps
OSパイプバッファーを満たすのに十分な出力が生成されると、無期限にハングする可能性があります(ps.stdout.close()
親で呼び出していないため)。それを避けるために、開始順序を入れ替えてください
または、常にサブプロセスオブジェクトで通信メソッドを使用できます。
cmd = "ps -A|grep 'process_name'"
ps = subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE,stderr=subprocess.STDOUT)
output = ps.communicate()[0]
print(output)
通信メソッドは、標準出力と標準エラーのタプルを返します。
サブプロセスを使用したパイプラインの設定に関するドキュメントを参照してください:http : //docs.python.org/2/library/subprocess.html#replacing-shell-pipeline
私は次のコード例をテストしていませんが、大体あなたが望むものであるはずです:
query = "process_name"
ps_process = Popen(["ps", "-A"], stdout=PIPE)
grep_process = Popen(["grep", query], stdin=ps_process.stdout, stdout=PIPE)
ps_process.stdout.close() # Allow ps_process to receive a SIGPIPE if grep_process exits.
output = grep_process.communicate()[0]
JKALAVISソリューションは優れていますが、SHELL = TRUEの代わりにshlexを使用するように改善を加えます。以下クエリ時間をgreppingアウト
#!/bin/python
import subprocess
import shlex
cmd = "dig @8.8.4.4 +notcp www.google.com|grep 'Query'"
ps = subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE,stderr=subprocess.STDOUT)
output = ps.communicate()[0]
print(output)