311

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

4

9 に答える 9

542

subprocessモジュールでパイプを使用するには、を渡す必要がありますshell=True

ただし、これはさまざまな理由で実際にはお勧めできません。特にセキュリティが重要です。代わりに、psgrepプロセスを別々に作成し、次のように一方から他方に出力をパイプします。

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

于 2012-11-11T14:58:02.073 に答える
68

または、サブプロセスオブジェクトでいつでもcommunicateメソッドを使用できます。

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

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

于 2012-11-11T16:35:06.177 に答える
27

サブプロセスを使用したパイプラインの設定に関するドキュメントを参照してください: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]
于 2013-06-16T00:48:09.240 に答える
21

subprocess.runを使用する

import subprocess
    
ps = subprocess.run(['ps', '-A'], check=True, capture_output=True)
processNames = subprocess.run(['grep', 'process_name'],
                              input=ps.stdout, capture_output=True)
print(processNames.stdout)
于 2020-11-12T00:50:29.713 に答える
4

sh.pyでパイプ機能を試すことができます:

import sh
print sh.grep(sh.ps("-ax"), "process_name")
于 2012-11-12T05:54:58.913 に答える
4

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

于 2012-11-13T10:34:47.927 に答える
0

JKALAVISソリューションは優れていますが、SHELL=TRUEの代わりにshlexを使用するように改善を追加します。以下のimはクエリ時間を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)
于 2018-04-28T01:09:36.687 に答える
0
command = "ps -A | grep 'process_name'"
output = subprocess.check_output(["bash", "-c", command])
于 2020-08-14T15:14:57.727 に答える
-1

Python 3.5以降では、次のものも使用できます。

    import subprocess

    f = open('test.txt', 'w')
    process = subprocess.run(['ls', '-la'], stdout=subprocess.PIPE, universal_newlines=True)
    f.write(process.stdout)
    f.close()

コマンドの実行はブロックされており、出力はprocess.stdoutになります。

于 2019-12-02T15:06:49.600 に答える