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.