web-dev-qa-db-fra.com

Comment exécuter "ps cax | grep quelque chose" en Python?

Comment exécuter une commande avec un tube | dedans?

Le module de sous-processus semble complexe ...

Y a-t-il quelque chose comme

output,error = `ps cax | grep something`

comme dans le script Shell?

29
eugene

Voir Remplacement du pipeline Shell :

import subprocess

proc1 = subprocess.Popen(['ps', 'cax'], stdout=subprocess.PIPE)
proc2 = subprocess.Popen(['grep', 'python'], stdin=proc1.stdout,
                         stdout=subprocess.PIPE, stderr=subprocess.PIPE)

proc1.stdout.close() # Allow proc1 to receive a SIGPIPE if proc2 exits.
out, err = proc2.communicate()
print('out: {0}'.format(out))
print('err: {0}'.format(err))

PS. En utilisant Shell=True peut-être dangereux. Voir par exemple l'avertissement dans la documentation.


Il y a aussi le module sh qui peut rendre les scripts de sous-processus dans Python beaucoup plus agréable:

import sh
print(sh.grep(sh.ps("cax"), 'something'))
47
unutbu

Vous avez déjà accepté une réponse, mais:

Avez-vous vraiment besoin pour utiliser grep? J'écrirais quelque chose comme:

import subprocess
ps = subprocess.Popen(('ps', 'cax'), stdout=subprocess.PIPE)
output = ps.communicate()[0]
for line in output.split('\n'):
    if 'something' in line:
        ...

Cela présente l'avantage de ne pas impliquer Shell=True et son risque, ne débouchent pas sur un processus grep séparé et ressemblent énormément au type de Python que vous écririez pour traiter des objets de type fichier de données.

17
Kirk Strauser
import subprocess

process = subprocess.Popen("ps cax | grep something",
                             Shell=True,
                             stdout=subprocess.PIPE,
                           )
stdout_list = process.communicate()[0].split('\n')
8
instigator

Supprimez ce sous-processus "ps" et reculez lentement! :)

Utilisez plutôt le module psutil .

7
Michael Kent
import os

os.system('ps -cax|grep something')

Si vous voulez remplacer l'argument grep par une variable:

os.system('ps -cax|grep '+your_var)
3
Mark Ma