2017-09-21 73 views
-1

我没有从下面的代码输出,但它也没有产生错误。当在命令行上手动输入命令时,我会得到很多输出。P.communicate()不返回输出,但退出代码为0

grepCommand = "box | grep " + grepHostKey 
grepCommand = grepCommand.split() 

p = subprocess.Popen(grepCommand, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
(hostString, err) = p.communicate() 
print hostString  
print err 

输出:

如果我添加壳=真我得到的只是“框”命令预期的反应,并没有管道输送到grep的。我已经看到,建议不要使用shell = True。我尝试过bufsize = 8192,它足够大,但仍然没有任何结果。关于什么是错的任何想法?

回答

1

管道是一个壳符号。这就是为什么这只能与shell = True一起工作。但正如你所说,这不是最佳做法。这里有一个代码可以用来通过子流程手动管道命令。

box_process = Popen(["box"], stdout=PIPE) 
grep_process = Popen(["grep", grepHostKey], stdin=box_process.stdout, stdout=PIPE) 
box_process.stdout.close() 
(hostString, err) = grep_process.communicate() 
+0

upvote for _not_ recommendation'shell = True' :) –