proyectos ejemplos python

python - ejemplos - Asigna la salida de os.system a una variable y evita que se muestre en la pantalla



django (7)

Quiero asignar la salida de un comando que ejecuta utilizando os.system a una variable y evitar que sea la salida a la pantalla. Pero, en el siguiente código, la salida se envía a la pantalla y el valor impreso para var es 0, lo que supongo que indica si el comando se ejecutó con éxito o no. ¿Hay alguna manera de asignar el resultado de comando en la variable y también dejar que se muestre en la pantalla?

var = os.system("cat /etc/services") print var #Prints 0


De " Equivalent of Bash Backticks in Python ", que pregunté hace mucho tiempo, lo que querrá usar es popen :

os.popen(''cat /etc/services'').read()

De los documentos para Python 3.6 ,

Esto se implementa utilizando subprocess.Popen; Consulte la documentación de esa clase para obtener formas más eficaces de administrar y comunicarse con los subprocesos.

Aquí está el código correspondiente para el subprocess :

import subprocess proc = subprocess.Popen(["cat", "/etc/services"], stdout=subprocess.PIPE, shell=True) (out, err) = proc.communicate() print "program output:", out


El módulo de comandos es una forma razonablemente de alto nivel para hacer esto:

import commands status, output = commands.getstatusoutput("cat /etc/services")

el estado es 0, la salida es el contenido de / etc / services.


Lo hago con el archivo temporal os.system:

import tempfile,os def readcmd(cmd): ftmp = tempfile.NamedTemporaryFile(suffix=''.out'', prefix=''tmp'', delete=False) fpath = ftmp.name if os.name=="nt": fpath = fpath.replace("/","//") # forwin ftmp.close() os.system(cmd + " > " + fpath) data = "" with open(fpath, ''r'') as file: data = file.read() file.close() os.remove(fpath) return data


Para Python 3.5+, se recomienda que use la función Ejecutar del módulo de subproceso . Esto devuelve un objeto CompletedProcess , desde el cual puede obtener fácilmente el resultado y el código de retorno. Como solo le interesa la salida, puede escribir un contenedor de utilidades como este.

from subprocess import PIPE, run def out(command): result = run(command, stdout=PIPE, stderr=PIPE, universal_newlines=True, shell=True) return result.stdout my_output = out("echo hello world") # Or my_output = out(["echo", "hello world"])


Python 2.6 y 3 dicen específicamente para evitar el uso de TUBO para stdout y stderr.

La forma correcta es

import subprocess # must create a file object to store the output. Here we are getting # the ssid we are connected to outfile = open(''/tmp/ssid'', ''w''); status = subprocess.Popen(["iwgetid"], bufsize=0, stdout=outfile) outfile.close() # now operate on the file


Sé que esto ya ha sido respondido, pero quería compartir una forma potencialmente mejor para llamar a Popen mediante el uso de from x import x y funciones:

from subprocess import PIPE, Popen def cmdline(command): process = Popen( args=command, stdout=PIPE, shell=True ) return process.communicate()[0] print cmdline("cat /etc/services") print cmdline(''ls'') print cmdline(''rpm -qa | grep "php"'') print cmdline(''nslookup google.com'')


También puede ser que desee ver en el subprocess módulo, que fue construido para reemplazar toda la familia de Python popen llamadas de tipo.

import subprocess output = subprocess.check_output("cat /etc/services", shell=True)

La ventaja que tiene es que hay una tonelada de flexibilidad con la forma en que invoca los comandos, donde se conectan los flujos de entrada / salida / error estándar, etc.