2014-09-19 128 views
1

我想在python脚本中嵌入一个命令并捕获输出。在这种情况下,我试图用"find"找到子目录数量不确定的文件数量不确定的,和grep每个匹配的文件为一个字符串,像这样:在Python中捕获复杂shell命令的输出

grep "rabbit" `find . -name "*.txt"` 

我跑的Python 2.6。 6(是的,我也很抱歉,但是现在不能让整个组织为此付出代价)。

我试过了一堆东西,使用subprocess,shlex等在这里已经提出,但我还没有找到一个语法,要么吞下去,或最终吸吮“查找... “as the search string for grep”等建议表示赞赏。 肯

+1

它可以很容易地使用'subprocess.call(...,壳=真)'但这样使用的shell来完成实际上使不安全的Python代码。为什么不从Python内部遍历目录并且执行grep在Python中执行的操作?它非常简单,使您的代码更加便携。 – 5gon12eder 2014-09-19 16:01:07

+0

@ 5gon12eder我可能最终会这样做,但有点想弄清楚如何做这个混乱作为命令输出。一直在看os.walk()。等等。还猜测如果我需要解析5或600个文件,那“mygrep”可能不如“realgrep”那么快。不过,我同意traverse/python是一个很好的选择,因为在发现兔子之后发生的事情会比找到它们需要更长的时间,但是我会这样做。 – Ken 2014-09-19 16:23:06

+0

相关:[如何使用subprocess.Popen通过管道连接多个进程?](http://stackoverflow.com/q/295459/4279) – jfs 2014-09-22 23:19:52

回答

2
import subprocess 


find_p = subprocess.Popen(["find", ".", "-name", "*.txt"], stdout=subprocess.PIPE) 
grep_p = subprocess.Popen(["xargs", "grep", "rabbit"], stdin=find_p.stdout) 

grep_p.wait() 
+2

这个'grep's为文件名列表中的“rabbit”,而不是在文件中。也就是说,它模仿'find。 -name“* .txt”| grep“兔子”而不是OP的命令。 – 5gon12eder 2014-09-19 16:02:44

+0

@ 5gon12eder啊真我忽略了,你可以使用xargs。不完全相同,但应该可以工作 – GP89 2014-09-19 16:05:48

+0

谢谢,这在第二个化身中似乎很有用。我最终可能会用上面提到的python来做遍历/解析,但是这样可以帮助快速解决问题。 - 肯 – Ken 2014-09-19 16:27:07