¿Por qué el eco simple en el subproceso no funciona?

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)