8

そのため、特定のマシンで上位 3 つの CPU を「集中的に使用する」プロセスを照会しようとしましたが、次のシェル コマンドでそれを実行できることがわかりました。ps -eo pcpu,pid,user,args | sort -k 1 -r | head -3

このデータを Python スクリプト内で使用したいので、subprocessモジュールを介して上記のコマンドの出力をキャプチャできるようにする必要があります。次は機能しますが、上位 3 つに制限していないため、巨大な文字列を返すだけです。

psResult = subprocess.check_output(['ps', '-eo', 'pcpu,user,args'])

これがどのように機能するのかよくわかりませんsubprocess.check_output..私が試したわずかな試みで:

subprocess.check_output(['ps', '-eo', 'pcpu,user,args', '|', 'sort', '-k', '1', '-r', '|', 'head', '-3'])

エラーが発生します:ps: illegal argument: |

Python 内でパイプ記号を使用するにはどうすればよいです|か、または によって返される巨大な文字列に対して信じられないほどの量の解析を行わなくてもソートを実行するには、他の方法を使用するにはどうすればよいpsResult = subprocess.check_output(['ps', '-eo', 'pcpu,user,args'])でしょうか?

ありがとう!よろしく、 -kstruct

4

4 に答える 4

12

shell=Trueプレーンシェルコマンドを実行する引数を渡すことができます:

import subprocess
subprocess.check_output('ps -eo pcpu,pid,user,args | sort -k 1 -r | head -3',
                        shell=True)

または、次のように ps および Python の組み込み文字列関数の並べ替えオプションを使用します。

raw = subprocess.check_output('ps -eo pcpu,pid,user,args --sort -pcpu')
first_three_lines = list(raw.split('\n'))[:3]
于 2012-05-01T22:59:26.147 に答える
11

を使用することを提案している他の人もいますが、信頼できる入力をシェルに渡す場合shell=Trueこの回答は問題ありません。ただし、shell=Trueいくつかの不安が生じます。セキュリティのために、ドキュメントでは次のことを推奨しています。

output=`dmesg | grep hda`
# becomes
p1 = Popen(["dmesg"], stdout=PIPE)
p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE)
p1.stdout.close()  # Allow p1 to receive a SIGPIPE if p2 exits.
output = p2.communicate()[0]
于 2013-02-26T22:29:40.180 に答える
1

あなたが使用する場合、それは動作するはずです:

subprocess.check_output("ps -eo pcpu,pid,user,args | sort -k 1 -r | head -3", shell=True)

コマンドは を使用してこのように実行/bin/shされるため、パイプが機能します。

于 2012-05-01T22:58:37.567 に答える
1

なぜ外部コマンドを使用するのですか? psutilを使用します。

import psutil
def cpu_percentage(proc):
    try:
        return proc.get_cpu_percent()
    except psutil.AccessDenied:
        return float('-inf')

top3 = sorted(psutil.process_iter(), key=cpu_percentage, reverse=True)[:3]
for proc in top3:
    # do whatever
于 2012-05-03T20:19:04.510 に答える