据我了解,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