Je veux utiliser subprocess.check_output()
avec ps -A | grep 'process_name'
. J'ai essayé différentes solutions mais jusqu'à présent, rien n'a fonctionné. Quelqu'un peut-il me guider comment le faire?
python
linux
subprocess
pipe
zuberuber
la source
la source
psutil
qui permet d'obtenir des informations de processus de manière portable.Réponses:
Pour utiliser un tuyau avec le
subprocess
module, vous devez passershell=True
.Cependant, ce n'est pas vraiment conseillé pour diverses raisons, dont la sécurité n'est pas la moindre. Au lieu de cela, créez les processus
ps
etgrep
séparément et dirigez la sortie de l'un vers l'autre, comme suit:Dans votre cas particulier, cependant, la solution simple est d'appeler
subprocess.check_output(('ps', '-A'))
puisstr.find
sur la sortie.la source
shell=True
subprocess.CalledProcessError: Command '('grep', 'process_name')' returned non-zero exit status 1
signifie simplement que rien n'a été trouvé par grep, c'est donc un comportement normal.ps.wait()
pour quand nous avons déjà la sortie.ps.wait.__doc__
attend la fin de l'enfant mais le contenu de l'enfant semble déjà placé dans laoutput
variablestring.find
, ce qui a été déprécié en faveurstr.find
(c'est-à-dire la méthodefind
sur lesstr
objets).grep
décède prématurément;ps
peut se bloquer indéfiniment s'il produit suffisamment de sortie pour remplir son tampon de tuyau OS (car vous n'avez pas appeléps.stdout.close()
le parent). Échangez l'ordre de départ, pour l'éviterOu vous pouvez toujours utiliser la méthode de communication sur les objets de sous-processus.
La méthode de communication renvoie un tuple de la sortie standard et l'erreur standard.
la source
communicate
est meilleure quewait
. Il y a un tel avertissement: "Cela bloquera lors de l'utilisation de stdout = PIPE et / ou stderr = PIPE et le processus enfant génère suffisamment de sortie vers un canal de telle sorte qu'il bloque l'attente de la mémoire tampon du canal du système d'exploitation pour accepter plus de données. Utilisez communic () pour éviter cela. "Voir la documentation sur la configuration d'un pipeline à l'aide d'un sous-processus: http://docs.python.org/2/library/subprocess.html#replacing-shell-pipeline
Je n'ai pas testé l'exemple de code suivant mais il devrait être à peu près ce que vous voulez:
la source
La solution JKALAVIS est bonne, mais j'ajouterais une amélioration pour utiliser shlex au lieu de SHELL = TRUE. ci-dessous im grepping out Query times
la source
Essayez également d'utiliser la
'pgrep'
commande au lieu de'ps -A | grep 'process_name'
la source
Vous pouvez essayer la fonctionnalité pipe dans sh.py :
la source
Après Python 3.5, vous pouvez également utiliser:
L'exécution de la commande est bloquante et la sortie sera dans process.stdout .
la source