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?
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'))
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.
import subprocess
process = subprocess.Popen("ps cax | grep something",
Shell=True,
stdout=subprocess.PIPE,
)
stdout_list = process.communicate()[0].split('\n')
Supprimez ce sous-processus "ps" et reculez lentement! :)
Utilisez plutôt le module psutil .
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)