J'essaie de faire un appel système en Python et de stocker la sortie dans une chaîne que je peux manipuler dans le programme Python.
#!/usr/bin/python
import subprocess
p2 = subprocess.Popen("ntpq -p")
J'ai essayé quelques choses, y compris certaines des suggestions ici:
Récupération de la sortie de subprocess.call ()
mais sans aucune chance.
python
subprocess
marque
la source
la source
"ntpq -p"
, ce qui est une partie différente de le problème que vous demandez.Réponses:
En Python 2.7 ou Python 3
Au lieu de créer un
Popen
objet directement, vous pouvez utiliser lasubprocess.check_output()
fonction pour stocker la sortie d'une commande dans une chaîne:En Python 2.4-2.6
Utilisez la
communicate
méthode.out
c'est ce que tu veux.Remarque importante sur les autres réponses
Notez comment j'ai passé la commande. L'
"ntpq -p"
exemple soulève une autre question. PuisquePopen
n'invoque pas le shell, vous utiliseriez une liste de commandes et d'options—["ntpq", "-p"]
.la source
Popen.communicate
ne revient pas tant que le processus n'est pas terminé.p = subprocess.Popen(["ntpq", "-p"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
subprocess.check_output()
retourne unbytes
objet, pas unstr
. Si tout ce que vous voulez faire, c'est imprimer le résultat, cela ne fera aucune différence. Mais si vous souhaitez utiliser une méthode telle quemyString.split("\n")
sur le résultat, vous devrez d'abord décoder l'bytes
objet:subprocess.check_output(myParams).decode("utf-8")
par exemple.universal_newlines=True
tant que paramètre m'a aidé dans Python 3 à obtenir l'objet chaîne. Si universal_newlines a la valeur True, ils sont ouverts en mode texte avec l'encodage par défaut. Sinon, ils sont ouverts en tant que flux binaires.Cela a fonctionné pour moi pour rediriger stdout (stderr peut être géré de la même manière):
Si cela ne fonctionne pas pour vous, veuillez spécifier exactement le problème que vous rencontrez.
la source
\n
.pipe.returncode == 0
après la dernière ligne.Popen
renvoie un tuple destdout
etstderr
, donc lorsque vous accédez,[0]
vous saisissez simplement lestdout
. Vous pourriez aussi fairetext, err = pipe.communicate()
et voustext
aurez alors ce que vous attendezEn supposant que ce
pwd
n'est qu'un exemple, voici comment vous pouvez le faire:Voir la documentation du sous - processus pour un autre exemple et plus d'informations.
la source
subprocess.Popen: http://docs.python.org/2/library/subprocess.html#subprocess.Popen
Dans le constructeur Popen, si shell vaut True , vous devez passer la commande sous forme de chaîne plutôt que sous forme de séquence. Sinon, divisez simplement la commande en une liste:
Si vous devez également lire l'erreur standard, dans l'initialisation Popen, vous pouvez définir stderr sur subprocess.PIPE ou sur subprocess.STDOUT :
la source
pour Python 2.7+, la réponse idiomatique est d'utiliser
subprocess.check_output()
Vous devriez également noter la gestion des arguments lors de l'appel d'un sous-processus, car cela peut être un peu déroutant ....
Si args est une commande unique sans argument propre (ou si vous l'avez
shell=True
défini), il peut s'agir d'une chaîne. Sinon, ce doit être une liste.par exemple ... pour appeler la
ls
commande, c'est bien:il en est de même:
cependant, si vous voulez passer quelques arguments à la commande shell, vous ne pouvez pas faire ceci:
à la place, vous devez le transmettre sous forme de liste:
la
shlex.split()
fonction peut parfois être utile pour diviser une chaîne en syntaxe de type shell avant de créer un sous-processus ... comme ceci:la source
Cela fonctionne parfaitement pour moi:
la source
C'était parfait pour moi. Vous obtiendrez le code retour, stdout et stderr dans un tuple.
Par exemple:
la source
La réponse acceptée est toujours bonne, juste quelques remarques sur les nouvelles fonctionnalités. Depuis python 3.6, vous pouvez gérer l'encodage directement dans
check_output
, voir la documentation . Cela renvoie un objet chaîne maintenant:En python 3.7, un paramètre a
capture_output
été ajouté à subprocess.run (), qui effectue une partie de la gestion de Popen / PIPE pour nous, voir les documents python :la source
Dans ce cas, vous n'aurez qu'un seul élément dans la liste.
la source
os.popen
est déconseillé au profit dusubprocess
module.J'ai écrit une petite fonction basée sur les autres réponses ici:
Usage:
la source
Dans Python 3.7, un nouvel argument de mot clé a
capture_output
été introduit poursubprocess.run
. Activation du court et simple:la source
Ceci est une solution en ligne
la source
Ce qui suit capture stdout et stderr du processus dans une seule variable. Il est compatible Python 2 et 3:
Si votre commande est une chaîne plutôt qu'un tableau, préfixez-la avec:
la source
Pour python 3.5, j'ai mis en place une fonction basée sur la réponse précédente. Le journal peut être supprimé, je pense que c'est bien d'avoir
la source
Utiliser la
ckeck_output
méthode desubprocess
Enfin analyser la chaîne
J'espère que cela aide, codage heureux
la source