Comment utiliser le sous-processus "commande" avec pipes
Je veux utiliser subprocess.check_output()
avec ps -A | grep 'process_name'
.
J'ai essayé plusieurs solutions mais jusqu'à présent, rien n'a fonctionné. Quelqu'un peut-il me guider comment faire?
- connexes: Comment puis-je utiliser des sous-processus.Popen de connecter plusieurs processus par des tuyaux?
- il y a
psutil
qui permet d'obtenir des informations de processus d'une manière portable.
Vous devez vous connecter pour publier un commentaire.
D'utiliser un tuyau avec la
subprocess
module, vous devez passershell=True
.Cependant, ce n'est pas vraiment souhaitable, pour diverses raisons, notamment de sécurité. Au lieu de cela, créer le
ps
etgrep
processus séparément, et le tuyau de la sortie de l'un en l'autre, comme suit:Dans votre cas particulier, cependant, la solution la plus simple est d'appeler
subprocess.check_output(('ps', '-A'))
et puisstr.find
sur la sortie.shell=True
subprocess.CalledProcessError: Command '('grep', 'process_name')' returned non-zero exit status 1
signifie simplement que rien n'a été trouvé par grep, donc c'est un comportement normal.ps.wait()
pour quand on a déjà la sortie.ps.wait.__doc__
attend l'enfant de mettre fin, mais le contenu de l'enfant semble être placés dans leoutput
variablestring.find
, qui a été dépréciée en faveur destr.find
(c'est à dire, la méthodefind
surstr
objets).grep
meurt prématurément;ps
peut se bloquer indéfiniment si elle produit suffisamment de puissance pour remplir ses OS pipe tampon (parce que vous n'avez pas appeléps.stdout.close()
dans le parent). Permuter l'ordre de départ, pour l'éviterps.wait()
au lieu deoutput.wait()
?output
est un bytestring et n'ont pas dewait
méthode.shell=True
: stackoverflow.com/questions/3172470/...ps.wait()
pour chaque commande dans l'ordre? @Taymonyes | accept_licenses
et depuisyes
n'a pas de fin, c'est propre, j'ai eu à fairetime.wait(10); ps.terminate()
au lieu deps.wait()
subprocess.Popen(['ps', '-A'], stdout=subprocess.PIPE)
au lieu desubprocess.Popen(('ps', '-A'), stdout=subprocess.PIPE)
? C'est la première fois que j'ai rencontré un tel usage et je me demande si il y a une raison.list
s ettuple
s sont des séquences, de sorte que les deux marchent. Ces derniers ne sont pas mutables et sont probablement plus rapide (bien que je n'ai jamais testé cette hypothèse). Dans ce cas, la différence n'est probablement pas significative.Ou vous pouvez toujours utiliser le communiquer méthode sur le processus secondaire objets.
Le communiquer méthode retourne un tuple de la sortie standard et l'erreur standard.
communicate
est mieux quewait
. Il cet avertissement: "Ce sera l'impasse lors de l'utilisation de stdout=TUYAU et/ou stderr=TUYAU et le processus de l'enfant génère suffisamment de puissance pour une pipe tel qu'il bloque en attendant que le système de tuyau tampon à accepter davantage de données. L'utilisation de communiquer() pour l'éviter."Voir la documentation sur la configuration d'un pipeline à l'aide d'un processus secondaire: http://docs.python.org/2/library/subprocess.html#replacing-shell-pipeline
Je n'ai pas testé l'exemple de code suivant, mais il doit être à peu près ce que vous voulez:
Vous pouvez essayer la pipe fonctionnalité dans sh.py:
Aussi, essayez d'utiliser
'pgrep'
de commande au lieu de'ps -A | grep 'process_name'
JKALAVIS solution est bonne, cependant je voudrais ajouter une amélioration de l'utilisation shlex au lieu de SHELL=TRUE. ci-dessous im grepping hors temps de Requête
Acclamations,