Almacene la salida del subproceso. Llamada a Popen en una cadena [duplicado]
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.
En Python 2.7 o Python 3
En lugar de crear un Popen
objeto 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 communicate
método.
import subprocess
p = subprocess.Popen(["ntpq", "-p"], stdout=subprocess.PIPE)
out, err = p.communicate()
out
es lo que quieres.
Nota importante sobre las otras respuestas.
Observe cómo pasé el comando. El "ntpq -p"
ejemplo plantea otra cuestión. Como Popen
no invoca el shell, usaría una lista de comandos y opciones ["ntpq", "-p"]
: .
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'
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.
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 shell
es 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 stderr
en 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 ).
Suponiendo que pwd
sea 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.