Я понимаю, что связь() будет ждать завершения процесса, хранения данных в буфере памяти и возврата. Я думал, что приведенный ниже код не будет эффективным, поскольку я хочу запросить все интересные rpms и собрать информацию по каждому из них. Это будет включать ~ 15 rpms на одном сервере для до 200 серверов в одной группе.subprocess.Popen.communicate not effient с большими наборами данных?
Я хочу запросить базу данных RPM в Linux и получить информацию из всех. Rpm и сохранить ее.
В Linux я хотел бы сделать это:
rpm -qa --qf '%{NAME} %{VERSION} %{RELEASE}\n' | grep this
и я могу использовать все --queryformat RPM обеспечивает.
Итак, у меня это в 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
Как я могу сделать это эффективным? Я видел, что я могу использовать потоки и потоки, но я не знаю, как это сделать.
RPM имеет программный интерфейс API с привязками Python, описанных здесь: http://docs.fedoraproject.org/en-US/Fedora_Draft_Documentation/0.1/html/RPM_Guide/ch-rpm-programming-python.html. Может быть, родная интеграция лучше, чем скручивание оболочки скрипта и скрипинг экрана? –
Я сделал хороший сценарий, который использовал это, к сожалению, я использую 2.7.8, и он не включен! – case