¿Por qué Popen (“cmd.exe echo a”, shell = True) no está ejecutando “echo”?

Esto lleva a un problema más grande que tengo aquí con Popen() .

Lo siguiente no hace lo que pensé que debería:

 x = subprocess.Popen("cmd.exe echo a", stdout=PIPE, shell=True) print (x.stdout.read()) 

Devuelve el mensaje de “título” de la consola cmd, pero echo a nunca se ejecuta.

Lo mismo con:

 x = subprocess.Popen(["cmd.exe", "echo a"], stdout=PIPE) print (x.stdout.read()) 

y

 cmd = "cmd.exe echo a" x = subprocess.Popen(shlex.split(cmd), stdout=PIPE) print (x.stdout.read()) 

El resultado final está en el terminal cmd abierto que imprime la “versión estándar de Microsoft Windows …” y una posición CLI de C:\Python36> .

cmd.exe requiere que el argumento /c preceda a que se pase una secuencia de comandos para su ejecución:

 x = subprocess.Popen(["cmd.exe", "/c", "echo a"], stdout=PIPE) print (x.stdout.read()) 

El comando cmd.exe procesador está implícito cuando especifica shell=True .

 >>> x = subprocess.Popen("echo a", stdout=subprocess.PIPE, shell=True) >>> print (x.stdout.read()) a 

Al invocarlo explícitamente, se inicia una consola de comandos anidada, como si hubiera escrito cmd.exe en el indicador. Su salida no va a la Popen() de Popen() .