360 votes

Sortie de magasin de sous-processus. Popen appel dans une chaîne

Salut à tous, j'essaye 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:

http://stackoverflow.com/questions/1996518/retrieving-the-output-of-subprocess-call

mais sans chance.

Merci beaucoup!

540voto

Mike Graham Points 22480

Utiliser l' communicate méthode.

import subprocess
p = subprocess.Popen(["ntpq", "-p"], stdout=subprocess.PIPE)
out, err = p.communicate()

out est ce que vous voulez.

Notez comment j'ai passé la commande. L' "ntpq -p" exemple pose une autre question. Depuis Popen n'est pas involke le shell, vous pouvez utiliser une liste de la commande et les options-["ntpq", "-p"].

En Python 2.7+ vous pouvez utiliser subprocess.check_output() de la fonction de stockage de la sortie d'une commande dans une chaîne de caractères:

from subprocess import check_output

out = check_output(["ntpq", "-p"])

42voto

Eli Bendersky Points 82298

Cela a fonctionné pour moi pour rediriger stdout (stderr peut être manipulé de la même manière):

 from subprocess import Popen, PIPE
pipe = Popen(path, stdout=PIPE)
text = pipe.communicate()[0]
 

Si cela ne fonctionne pas pour vous, veuillez préciser exactement le problème que vous rencontrez.

30voto

Paolo Rovelli Points 892

sous-processus.Popen: http://docs.python.org/2/library/subprocess.html#subprocess.Popen

import subprocess

command = "ntpq -p"  # the shell command
process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=None, shell=True)

#Launch the shell command:
output = process.communicate()

print output[0]

Dans le Popen constructeur, si la coquille est Vrai, vous devez passer une commande en tant que chaîne de caractères, plutôt que comme une séquence. Sinon, il suffit de fractionner la commande en une liste:

command = ["ntpq", "-p"]  # the shell command
process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=None)

Si vous avez besoin de lire également la norme de l'erreur, dans le Popen d'initialisation, vous pouvez définir stderr de sous-processus.De la PIPE ou de sous-processus.STDOUT:

import subprocess

command = "ntpq -p"  # the shell command
process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)

#Launch the shell command:
output, error = process.communicate()

25voto

Mark Byers Points 318575

En supposant que pwd n'est qu'un exemple, voici comment vous pouvez le faire:

 import subprocess

p = subprocess.Popen("pwd", stdout=subprocess.PIPE)
result = p.communicate()[0]
print result
 

Voir la documentation du sous - processus pour un autre exemple et plus d'informations.

11voto

Patrick Points 846

Cela fonctionne parfaitement pour moi:

 import subprocess
try:
    #prints results and merges stdout and std
    result = subprocess.check_output("echo %USERNAME%", stderr=subprocess.STDOUT, shell=True)
    print result
    #causes error and merges stdout and stderr
    result = subprocess.check_output("copy testfds", stderr=subprocess.STDOUT, shell=True)
except subprocess.CalledProcessError, ex: # error code <> 0 
    print "--------error------"
    print ex.cmd
    print ex.message
    print ex.returncode
    print ex.output # contains stdout and stderr together 
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X