Я уже несколько дней борюсь с Popen на python, поэтому решил все мои сомнения, надеюсь, все они могут быть разъяснены экспертами python.python Popen: Как заблокировать выполнение команды grep до тех пор, пока содержимое grep не будет готово?
Первоначально я использую Popen для выполнения команды и grep результат (как одна команда с использованием pipe, что-то вроде xxx | grep yyy
), с shell=False
, как вы можете себе представить, это не работает. После руководство в this посте я изменил код к следующему:
checkCmd = ["sudo", "pyrit", "-r", self.capFile, "analyze"]
checkExec = Popen(checkCmd, shell=False, stdout=PIPE, stderr=STDOUT)
grepExec = Popen(["grep", "good"], stdin=checkExec.stdout, stdout=PIPE)
output = grepExec.stdout.readline()
output = grepExec.communicate()[0]
Но я понял, что checkExec
работает медленно и с тех Popen неблокирующая, grepExec
всегда получают выполняться до checkExec
показывает какой-либо результат, таким образом, Выход grep всегда будет пустым. Как отложить выполнение grepExec
до checkExec
?
В другой программе Popen в моей программе я попытался сохранить сервис на задней панели, поэтому я использую отдельный поток для его выполнения. Когда все задачи выполняются, я уведомляю этот поток о завершении работы, и я просто вызываю Popen.kill(), чтобы остановить службу. Однако моя система заканчивается процессом зомби, который не получил. Я не знаю, есть ли хороший способ очистить все в этом фоновом потоке после его завершения?
В чем разница между Popen.communicate() [0] и Popen.stdout.readline()? Могу ли я использовать цикл для чтения вывода данных из обоих?
Есть ли конкретная причина, по которой вы не хотите использовать функциональные возможности оболочки оболочки? (с '|') – mensi
@mensi: Я указал shell = False, поэтому труба может не работать. Вначале я пробовал трубу в shell = False, но Popen выполняет команду без grep после этого. –
@mensi есть много веских причин, чтобы ваш «Popen» не создавал подоболочку - выполняя прямой сценарий «execv()» из вашего скрипта, означает, что вам не нужно указывать аргументы, которые нужно проанализировать оболочка, как вы ожидаете, которая может быть очень большой сделкой с точки зрения безопасности, если она содержит данные, созданные пользователем. –