2017-06-05 147 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()的管道。