web-dev-qa-db-ja.com

パイプで `subprocess`コマンドを使う方法

subprocess.check_output()ps -A | grep 'process_name'と一緒に使いたいのですが。私はさまざまな解決策を試しましたが、これまでのところ何もうまくいきませんでした。誰かが私にそれを行う方法を教えてもらえますか?

186
zuberuber

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を呼び出すことです。

360
Taymon

あるいは、サブプロセスオブジェクトでは常にcommunicationメソッドを使用できます。

cmd = "ps -A|grep 'process_name'"
ps = subprocess.Popen(cmd,Shell=True,stdout=subprocess.PIPE,stderr=subprocess.STDOUT)
output = ps.communicate()[0]
print output

通信メソッドは標準出力と標準エラーのタプルを返します。

50
jkalivas

サブプロセスを使用したパイプラインの設定に関するドキュメントを参照してください。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]
20
AlcubierreDrive

また、'pgrep'の代わりに'ps -A | grep 'process_name'コマンドを使用してください。

3
Shooe

JKALAVISの解決策は良いですが、Shell = TRUEの代わりにshlexを使うように改善を加えます。以下のクエリ時間を省略

#!/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

乾杯、

3
Daniel Smith

パイプの機能は sh.py で試すことができます。

import sh
print sh.grep(sh.ps("-ax"), "process_name")
3
amoffat