examples example espaƱol check_output python subprocess

python - example - Almacena la salida de subprocess.Popen call en una cadena



subprocess.check_output example python (9)

Escribí una pequeña función basada en las otras respuestas aquí:

def pexec(*args): return subprocess.Popen(args, stdout=subprocess.PIPE).communicate()[0].rstrip()

Uso:

changeset = pexec(''hg'',''id'',''--id'') branch = pexec(''hg'',''id'',''--branch'') revnum = pexec(''hg'',''id'',''--num'') print(''%s : %s (%s)'' % (revnum, changeset, branch))

Estoy intentando hacer una llamada al sistema en Python y almacenar la salida en una cadena que puedo manipular en el programa de Python.

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

He intentado algunas cosas incluyendo algunas de las sugerencias aquí:

Recuperando la salida de subprocess.call ()

pero sin suerte.


Esto fue perfecto para mí. Obtendrá el código de retorno, stdout y stderr en una tupla.

from subprocess import Popen, PIPE def console(cmd): p = Popen(cmd, shell=True, stdout=PIPE) out, err = p.communicate() return (p.returncode, out, err)

Por ejemplo:

result = console(''ls -l'') print ''returncode: %s'' % result[0] print ''output: %s'' % result[1] print ''error: %s'' % result[2]


Esto funciona perfectamente para mi:

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


Esto me funcionó para redireccionar stdout (stderr puede manejarse de manera similar):

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

Si no funciona para usted, especifique exactamente el problema que tiene.


Suponiendo que pwd es 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.


subprocess.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]

En el constructor de Popen, si el shell es True , debe pasar el comando como una cadena en lugar de una secuencia. De lo contrario, simplemente divide el comando en una lista:

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

Si necesita leer también el error estándar, en la inicialización de Popen, puede establecer stderr en subprocess.PIPE o subprocess.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()


En Python 2.7 o Python 3

En lugar de hacer un objeto Popen directamente, puede usar la función subprocess.check_output() para almacenar la salida de un comando en una cadena:

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

En Python 2.4-2.6

Utilice el método de communicate .

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.

Tenga en cuenta cómo pasé en el comando. El "ntpq -p" trae otro tema. Ya que Popen no invoca el shell, debería usar una lista del comando y las opciones— ["ntpq", "-p"] .


para Python 2.7+ la respuesta idiomática es usar subprocess.check_output()

También debe tener en cuenta el manejo de los argumentos al invocar un subproceso, ya que puede ser un poco confuso ...

Si args es solo un comando único sin argumentos propios (o si tiene shell=True set), puede ser una cadena. De lo contrario debe ser una lista.

por ejemplo ... para invocar el comando ls , esto está bien:

from subprocess import check_call check_call(''ls'')

asi es esto:

from subprocess import check_call check_call([''ls'',])

sin embargo, si desea pasar algunos argumentos al comando de shell, no puede hacer esto:

from subprocess import check_call check_call(''ls -al'')

en su lugar, debe pasarlo como una lista:

from subprocess import check_call check_call([''ls'', ''-al''])

La función shlex.split() veces puede ser útil para dividir una cadena en una sintaxis similar a una shell antes de crear un subproceso ... como esto:

from subprocess import check_call import shlex check_call(shlex.split(''ls -al''))


import os list = os.popen(''pwd'').read()

En este caso solo tendrá un elemento en la lista.