据我了解,communicate() 将等待进程完成,将数据存储在内存缓冲区中并返回。我认为下面的代码效率不高,因为我想查询所有有趣的 rpm 并收集每个 rpm 的信息。这将涉及一台服务器上大约 15 rpm,一组最多 200 台服务器。

我想查询 Linux 中的 RPM DB,从每个 .rpm 中获取信息并将其存储。

在 Linux 中我会这样做:

rpm -qa --qf '%{NAME} %{VERSION} %{RELEASE}\n' | grep this 

我可以使用 RPM 提供的所有 --queryformat。

所以我在Python中有这个,它可以工作。但我想让事情变得简单。

def getrpms(): 
queryall = [] 
rpmqa = subprocess.Popen(['rpm', '-qa'], stdout=subprocess.PIPE,) 
grep = subprocess.Popen(['grep', 'stuff'], stdin=rpmqa.stdout, stdout=subprocess.PIPE,) 
sort = subprocess.Popen(['sort', '-r'], stdin=grep.stdout, stdout=subprocess.PIPE,) 
end_of_pipe = sort.stdout 
 
for line in end_of_pipe: 
    queryall.append(line.strip()) 
return queryall 
 
def rpminfo(): 
for rpm in getrpms(): 
    command = "rpm -qi {} ".format(rpm) 
    args = shlex.split(command) 
    p = subprocess.Popen(args, stdout=subprocess.PIPE) 
    pl = p.communicate()    # returns a tuple 
    print pl 

如何提高效率?我看到我可以使用线程和流,但我不知道如何使用。

请您参考如下方法:

Note The data read is buffered in memory, so do not use this method if the data size is large or unlimited.

在这种情况下,“大”是模糊的,但它往往意味着多个兆字节,甚至更多。单个 RPM 的 rpm -qi 输出应该远不及这个大小。我不会担心这里的效率。

除此之外,无需将命令行构建为单个字符串,只是为了再次拆分它。建立一个列表来开始:

p = subprocess.Popen(['rpm', '-qi', rpm, stdout=subprocess.PIPE) 
<小时 />

为了避免构建所有 RPM 的大型内存列表(与 stuff 匹配),请将 getrpms() 改为生成器。这样,您就不必一次从子流程中读取所有文本行;您一次可以读取并处理一行。

def getrpms(): 
    rpmqa = subprocess.Popen(['rpm', '-qa'], stdout=subprocess.PIPE) 
    grep = subprocess.Popen(['grep', 'stuff'], stdin=rpmqa.stdout, stdout=subprocess.PIPE) 
    sort = subprocess.Popen(['sort', '-r'], stdin=grep.stdout, stdout=subprocess.PIPE,) 
 
    for line in sort.stdout: 
        yield line 


评论关闭
IT源码网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!