2017-06-05 155 views
0

这导致了一个更大的问题,我有herePopen()为什么Popen(“cmd.exe echo a”,shell = True)没有运行“echo”?

以下没有做什么,我认为应该:

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

返回CMD控制台的“称号”的消息,但绝不会在执行echo a

与相同:

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

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

最终的结果是在打印标准的开放CMD终端 “Microsoft Windows版本...” 和C:\Python36>一个CLI位置。

回答

3

cmd.exe需要的参数/c先于被传递执行的脚本:

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

现在如果我想说'C:\ Users \ Me>'C:\ path \ to \ app.exe arg1 arg2'的'stdout'?如果我打开一个cmd控制台并提供.exe路径和参数,输出会生成为“stdout”,但我似乎无法像在我的OP中的链接中概述的那样使用“subprocess”进行复制。 – madeslurpy

2

当您指定shell=True命令处理器cmd.exe是隐含的。

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

通过调用它明确你火了一个嵌套命令控制台,就好像你在提示符下键入cmd.exe。它的输出不会去Popen()的管道。