2016-10-29 48 views
0

我正在製作一個GUI,可以使用子進程和tkinter在命令提示符下執行。subprocess - FileNotFoundError當shell = False

def test_subprocess(self): 
     proc = subprocess.Popen(["echo", "Hello"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, universal_newlines=True, shell=False) 
     response = proc.communicate()[0] 
     self.log.insert("end", response) 

如果我設置shell=False,我得到這個錯誤:

FileNotFoundError: [WinError 2] The system cannot find the file specified 

我已經論據分爲序列。

回答

3

這是因爲echo是Windows中的內置命令,而不是可執行文件。您已有以使shell=True能夠正常工作。

(或加外殼的前綴,如bash -ccmd /c視操作系統而定)

前你在Windows上:該作品:

proc = subprocess.Popen(["cmd", "/c", "echo", "Hello"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, universal_newlines=True, shell=False) 

不過,我想這只不過是一個練習,因爲從運行Popenecho是矯枉過正print :)

注:在Linux/UNIX的是內置的太多,但作爲cdarke說,有一個備用可執行文件中/bin在某些版本上,所以這將工作。

+1

只是要補充一點,許多UNIX系統都有'/ bin/echo'以及shell內建的,所以你可能只會在Windows上得到這個特定的問題。 – cdarke

+1

@cdarke:很好。用戶清楚地使用Windows,錯誤信息是有史以來最差的,甚至不知道哪個文件無法找到:) –

+0

當文件名不被報告時,你不討厭它嗎?它該死的*知道*哪個文件找不到,但不能打擾告訴我們。你甚至不能運行'strace'來找出答案。 – cdarke