2015-09-03 72 views
0

當我執行腳本我得到這個錯誤:如何使外殼瞭解到,正在通過subprocess.call通過通配符()

['grep', 'PORTALSHARED', '*'] 
grep: *: No such file or directory 

同樣的命令,當我執行上工作得很好貝殼。

下面是腳本:

a = shlex.split('grep PORTALSHARED *') 
print a 

for pdir, _, _ in os.walk(r'/Users/skandasa/perforce/projects/releases/portal-7651'): 
    os.chdir(pdir) 
    print os.getcwd() 
    subprocess.call(a) 

我曾嘗試加入shell = True但沒有奏效。

回答

2

*是由外殼擴展,所以如果你想subprocess.call()對這項工作,你需要在shell=True通過。示例 -

a = 'grep PORTALSHARED *' 
subprocess.call(a, shell=True) 

請大家注意,在使用時shell=True,你應該完整的字符串作爲命令,而不是split版本發送。


但考慮到這一點,我不認爲你真的需要的os.chdir(),你可以相當嘗試 -

a = 'grep PORTALSHARED {}' 
for pdir, _, _ in os.walk(r'/Users/skandasa/perforce/projects/releases/portal-7651'): 
    subprocess.call(a.format(pdir + '/*'), shell=True) 
+0

你確定你要發送的完整的字符串,而不是分裂的版本,因爲我有在答覆中說。 –

+0

我很抱歉,評論是其他答案。我認爲你的解決方案似乎很有用,因爲它需要一些時間來獲得結果。順便說一下,請允許我告訴我如何通過'grep PORTALSHARED * | awk -F'[''{print $ 1}'''命令通過'subprocess'作爲'shlex.split'只做這個'['grep','PORTALSHARED','*','|','awk',' -F','[','{print $ 1}']'子進程需要每個項目用單引號引起來。 –

+1

您不能在shell = True的情況下使用'shlex.split()'。所以不要分割,直接使用字符串,使用'雙引號'來創建字符串,而不是單引號。就像''grep PORTALSHARED * | awk -F'[''{print $ 1}'「' –