2015-09-03 34 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}'“' –