Almacene la salida del subproceso. Llamada a Popen en una cadena [duplicado]

Resuelto Mark asked hace 14 años • 15 respuestas

Estoy intentando realizar una llamada al sistema en Python y almacenar el resultado en una cadena que pueda manipular en el programa Python.

#!/usr/bin/python
import subprocess
p2 = subprocess.Popen("ntpq -p")

Probé algunas cosas, incluidas algunas de las sugerencias aquí:

Recuperando la salida de subprocess.call()

pero sin suerte.

Mark avatar Mar 24 '10 02:03 Mark
Aceptado

En Python 2.7 o Python 3

En lugar de crear un Popenobjeto directamente, puedes usar la subprocess.check_output()función para almacenar el resultado de un comando en una cadena:

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

En Python 2.4-2.6

Utilice el communicatemétodo.

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

outes lo que quieres.

Nota importante sobre las otras respuestas.

Observe cómo pasé el comando. El "ntpq -p"ejemplo plantea otra cuestión. Como Popenno invoca el shell, usaría una lista de comandos y opciones ["ntpq", "-p"]: .

Mike Graham avatar Mar 23 '2010 19:03 Mike Graham

En Python 3.7 + puedes usar el nuevo capture_output=argumento de palabra clave para subprocess.run:

import subprocess

p = subprocess.run(["echo", "hello world!"], capture_output=True, text=True)
assert p.stdout == 'hello world!\n'
erb avatar Nov 18 '2019 13:11 erb

Esto funcionó para mí para redirigir stdout (stderr se puede manejar de manera similar):

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

Si no te funciona, especifica exactamente el problema que tienes.

Eli Bendersky avatar Mar 23 '2010 19:03 Eli Bendersky

Python 2 : http://docs.python.org/2/library/subprocess.html#subprocess.Popen

from subprocess import PIPE, Popen

command = "ntpq -p"
process = Popen(command, stdout=PIPE, stderr=None, shell=True)
output = process.communicate()[0]
print output

En el constructor de Popen, si shelles True , debes pasar el comando como una cadena en lugar de una secuencia. De lo contrario, simplemente divida el comando en una lista:

command = ["ntpq", "-p"]
process = Popen(command, stdout=PIPE, stderr=None)

Si necesita leer también el error estándar, en la inicialización de Popen, debe configurarlo stderren PIPE o STDOUT :

command = "ntpq -p"
process = subprocess.Popen(command, stdout=PIPE, stderr=PIPE, shell=True)
output, error = process.communicate()

NOTA: A partir de Python 2.7, podría/debería aprovechar subprocess.check_output( https://docs.python.org/2/library/subprocess.html#subprocess.check_output ).


Python 3 : https://docs.python.org/3/library/subprocess.html#subprocess.Popen

from subprocess import PIPE, Popen

command = "ntpq -p"
with Popen(command, stdout=PIPE, stderr=None, shell=True) as process:
    output = process.communicate()[0].decode("utf-8")
    print(output)

NOTA: Si está apuntando solo a versiones de Python superiores o iguales a 3.5, entonces podría/debería aprovechar subprocess.run( https://docs.python.org/3/library/subprocess.html#subprocess.run ).

Paolo Rovelli avatar Apr 28 '2013 19:04 Paolo Rovelli

Suponiendo que pwdsea solo un ejemplo, así es como puedes hacerlo:

import subprocess

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

Consulte la documentación del subproceso para ver otro ejemplo y más información.

Mark Byers avatar Mar 23 '2010 19:03 Mark Byers