Это, безусловно, возможно: мой пакет python-gnupg
делает именно это, порождая gpg
(Gnu Privacy Guard) в рамках подпроцесса.В общем случае вам нужно указать subprocess.PIPE
для подпроцесса stdout и stderr;затем создайте два отдельных потока, которые читают подпроцесс stdout и stderr в любое удобное для вас место.
В случае python-gnupg
сообщения о состоянии от gpg читаются и обрабатываются во время выполнения процесса gpg
(неожидание, пока оно не закончится).
По сути, псевдокод равен
process = subprocess.Popen(..., stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stderr = process.stderr
rr = threading.Thread(target=response_reader_func, args=(process.stderr,))
rr.setDaemon(True)
rr.start()
dr = threading.Thread(target=data_reader_func, args=(process.stdout,))
dr.setDaemon(True)
dr.start()
dr.join()
rr.join()
process.wait()
Функции считывателя обычно представляют собой методы включающего класса, которые делают правильные вещи в зависимости от того, что они читаютслучай, обновление информации о прогрессе в некотором роде).