Python subprocess模块 - Popen方法与bash find命令中的-exec

0 投票
2 回答
1113 浏览
提问于 2025-04-17 06:35

我在使用Python的subprocess模块,具体是用Popen方法。

我想要实现的目标:

我想用Popen执行一个bash命令,如果找到包含"stderr"这个字符串的文件,就返回匹配结果。

代码如下:

bash

find . -exec grep "stderr" {} +

我在Python中做的事情:

from subprocess import Popen, PIPE


command = "find . -exec grep 'stderr' {} +"
stream  = Popen(command, stdout=PIPE, shell=True, cwd=dir)
stream_stdout, stream_stderr = stream.communicate()

我得到的结果:

看起来这个方法有效,因为stream_stdout和stream_stderr返回了我预期的内容,但我在屏幕上看到了一些文本:

 find: missing argument to `-exec'

有没有人知道这是为什么?

*补充说明: 我在{}+之间没有加空格,这就是我之前得到那个输出的原因。抱歉!*

谢谢,

Mike

2 个回答

0

你为什么要使用subprocess模块呢?

这段代码,来自Beazley先生,能完成这个任务吗?

import os
import fnmatch
import re

def gen_find(filepat,top):
    for path, dirlist, filelist in os.walk(top):
        for name in fnmatch.filter(filelist,filepat):
            yield os.path.join(path,name)

def grep(pat,lines):
    patc = re.compile(pat)
    for line in lines:
        if patc.search(line): return True

for f in gen_find("*","."):
    fopen = open(f, 'rb')
    if grep("stderr",fopen.readlines()):
         print f
0

试着把你的命令做成一个参数列表:

command = "find . -exec grep 'stderr' {} +".split(" ")

补充说明:抱歉,我没意识到Popen()可以接受一个字符串。这个回答是不正确的。

撰写回答