2017-02-17 27 views
0

寫一個非常簡單的Python腳本ls我的項目目錄的內容作爲測試後:subprocess.Popen返回命令沒有找到

from subprocess import * 
p = Popen(['ls /Users/Nelson/Projects'], stdout=PIPE, shell=True) 
print(p.communicate()[0].decode()) 

它踢出錯誤:

/bin/bash: ls: command not found 

我做了一些測試,發現基本命令pwd,echocd所有單詞都很好,但不是ls。我嘗試使用選項executable='/bin/bash',因爲它默認爲/bin/sh,但沒有做任何事情。

此腳本已經在Ubuntu 14.04 LTS和Ubuntu 16.04 LTS上測試過,兩者都正常工作。

我使用的是Mac OSX 10.12.3塞拉利昂如果這意味着在這種情況下

任何響應都非常感謝什麼!

+0

根據記錄,'pwd','echo'和' cd'都是'bash'內建的,而'ls'是一個獨立的可執行程序,而不是內建的。這可能是行爲差異的根源。 – ShadowRanger

回答

1

如果使用list調用,則需要自己拆分參數(而不是使用shell=True)。嘗試:

Popen(['ls', '/Users/Nelson/Projects'], ... leave off shell=True ...) 

它將命令(ls)從唯一參數中分離出來。如果你有多個參數,它們也必須相互分離。

如果你堅持shell=True(一個可怕的想法大部分時間),不使用list,只是原始的字符串:

Popen('ls /Users/Nelson/Projects', ...) 
+0

非常感謝!我曾嘗試過,沒有輸入命令爲1字符串或2,以及有和沒有shell = True。我想我錯過了那個組合 – Nelson

+0

這是不真實的。你絕對可以將一個列表傳遞給'shell = True'。該列表的第一個元素被解析爲一個shell腳本;後續的參數是該shell中的$ 0,$ 1等。 –