Estoy tratando de realizar una operación de eco simple usando subproceso:
import subprocess import shlex cmd = 'echo $HOME' proc = subprocess.Popen(shlex.split(cmd), shell=True, stdout=subprocess.PIPE) print proc.communicate()[0]
Pero no imprime nada. Incluso si cambio el comando para echo "hello, world"
todavía no se imprime nada. Cualquier ayuda es apreciada.
En Unix shell=True
implica que los argumentos segundo y siguientes son para el propio shell, use una cadena para pasar un comando al shell:
import subprocess cmd = 'echo $HOME' proc = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE) print proc.communicate()[0],
También puedes escribirlo como:
import subprocess cmd = 'echo $HOME' print subprocess.check_output(cmd, shell=True),
De los documentos del subproceso :
En Unix con
shell=True
, el shell por defecto es / bin / sh. Si args es una cadena, la cadena especifica el comando que se ejecutará a través del shell. Esto significa que la cadena debe tener el formato exactamente como se escribiría en el indicador de comandos del shell. Esto incluye, por ejemplo, citar o hacer una barra diagonal inversa en los nombres de archivo con espacios en ellos. Si args es una secuencia, el primer elemento especifica la cadena de comando, y cualquier elemento adicional se tratará como argumentos adicionales al propio shell . Es decir, Popen hace el equivalente de:
Popen(['/bin/sh', '-c', args[0], args[1], ...])
Estás confundiendo las dos invocaciones diferentes de Popen. Cualquiera de estos funcionará:
proc=subprocess.Popen(['/bin/echo', 'hello', 'world'], shell=False, stdout=subprocess.PIPE)
o
proc=subprocess.Popen('echo hello world', shell=True, stdout=subprocess.PIPE)
Cuando se pasa shell = True, el primer argumento es una cadena: la línea de comandos del shell. Cuando no se usa el shell, el primer argumento es una lista. Ambos producen esto:
print proc.communicate() ('hello world\n', None)