Вопрос по python, shell – трубопровод в оболочке через модуль подпроцесса Python

6

Итак, я пытаюсь запросить 3 процессора "интенсивно" процессы на данной машине, и я нашел эту команду оболочки, чтобы сделать это: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

Вы можете написать скрипт оболочки, содержащий ваш код с каналами, а затем вызвать его из модуля подпроцесса jedwards

Ваш Ответ

4   ответа
6

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]
11

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]
1

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

Затем команда запускается так же, как это с помощью/bin/sh, так что трубы будут работать.

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

Похожие вопросы