Estoy tratando de hacer una llamada al sistema en Python y almacenar el resultado en una cadena que puedo manipular en el programa Python.
#!/usr/bin/python
import subprocess
p2 = subprocess.Popen("ntpq -p")
He intentado algunas cosas, incluidas algunas de las sugerencias aquí:
Recuperando la salida de subprocess.call ()
Pero sin suerte.
python
subprocess
marca
fuente
fuente
"ntpq -p"
, que es una parte diferente de el problema del que estás preguntando.Respuestas:
En Python 2.7 o Python 3
En lugar de crear un
Popen
objeto directamente, puede usar lasubprocess.check_output()
función para almacenar la salida de un comando en una cadena:En Python 2.4-2.6
Usa el
communicate
método.out
es lo que quieresNota importante sobre las otras respuestas.
Tenga en cuenta cómo pasé el comando. El
"ntpq -p"
ejemplo plantea otro asunto. ComoPopen
no invoca el shell, usaría una lista de comandos y opciones—["ntpq", "-p"]
.fuente
Popen.communicate
no regresa hasta que el proceso haya finalizado.p = subprocess.Popen(["ntpq", "-p"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
subprocess.check_output()
devuelve unbytes
objeto, no unstr
. Si todo lo que quiere hacer es imprimir el resultado, eso no hará ninguna diferencia. Pero si desea utilizar un método comomyString.split("\n")
el resultado, primero deberá decodificar elbytes
objeto:subprocess.check_output(myParams).decode("utf-8")
por ejemplo.universal_newlines=True
como parámetro me ayudó en Python 3 a obtener el objeto de cadena. Si universal_newlines es True, se abren en modo texto con codificación predeterminada. De lo contrario, se abren como secuencias binarias.Esto funcionó para mí para redirigir stdout (stderr se puede manejar de manera similar):
Si no funciona para usted, especifique exactamente el problema que está teniendo.
fuente
\n
.pipe.returncode == 0
después de la última línea también.Popen
devuelve una tupla destdout
ystderr
, así que cuando accedes[0]
solo estás agarrando elstdout
. También podría hacertext, err = pipe.communicate()
y luegotext
tendrá lo que esperaAsumiendo que
pwd
es solo un ejemplo, así es como puedes hacerlo:Consulte la documentación del subproceso para otro ejemplo y más información.
fuente
subprocess.Popen: http://docs.python.org/2/library/subprocess.html#subprocess.Popen
En el constructor de Popen, si shell es True , debe pasar el comando como una cadena en lugar de como una secuencia. De lo contrario, simplemente divida el comando en una lista:
Si necesita leer también el error estándar, en la inicialización de Popen, puede establecer stderr en subprocess.PIPE o en subprocess.STDOUT :
fuente
para Python 2.7+ la respuesta idiomática es usar
subprocess.check_output()
También debe tener en cuenta el manejo de argumentos al invocar un subproceso, ya que puede ser un poco confuso ...
Si args es solo un comando sin ningún argumento propio (o lo ha
shell=True
configurado), puede ser una cadena. De lo contrario, debe ser una lista.por ejemplo ... para invocar el
ls
comando, está bien:asi es esto:
sin embargo, si desea pasar algunos argumentos al comando de shell, no puede hacer esto:
en su lugar, debe pasarlo como una lista:
La
shlex.split()
función a veces puede ser útil para dividir una cadena en una sintaxis tipo shell antes de crear un subproceso ... como este:fuente
Esto funciona perfectamente para mi:
fuente
Esto fue perfecto para mi. Obtendrá el código de retorno, stdout y stderr en una tupla.
Por ejemplo:
fuente
La respuesta aceptada sigue siendo buena, solo algunas observaciones sobre las nuevas funciones. Desde python 3.6, puede manejar la codificación directamente
check_output
, consulte la documentación . Esto devuelve un objeto de cadena ahora:En python 3.7,
capture_output
se agregó un parámetro a subprocess.run (), que realiza parte del manejo de Popen / PIPE por nosotros, consulte los documentos de python :fuente
En este caso, solo tendrá un elemento en la lista.
fuente
os.popen
está en desuso a favor delsubprocess
módulo.Escribí una pequeña función basada en las otras respuestas aquí:
Uso:
fuente
En Python 3.7
capture_output
se introdujo un nuevo argumento de palabra clave parasubprocess.run
. Habilitando lo corto y simple:fuente
Esta es una solución de línea
fuente
Lo siguiente captura stdout y stderr del proceso en una sola variable. Es compatible con Python 2 y 3:
Si su comando es una cadena en lugar de una matriz, prefije esto con:
fuente
Para python 3.5 puse una función basada en la respuesta anterior. Se puede eliminar el registro, aunque es bueno tener
fuente
Utilizar el
ckeck_output
método desubprocess
Finalmente analizar la cadena
Espero que ayude, feliz codificación
fuente