Почему subprocess.Popen() не дает прямую трансляцию?
Извините за форматирование поста, если оно не совсем правильное, я здесь новенький :)
Я работаю над автоматизированной структурой для инструмента биоинформатики. Поскольку большая часть программного обеспечения, которое будет использовать моя программа, написана для Linux, а не на Python, я использую подпроцесс для вызова процессов. У меня проблема в том, что многие шаги в конвейере занимают очень много времени, и я хочу видеть результат в реальном времени, чтобы знать, что он все еще работает и не зависает или что-то в этом роде. Но мне также нужно будет записать вывод, чтобы регистрировать любые неожиданные ошибки после завершения процесса.
Я обнаружил, что subprocces.Popen() - это то, что мне нужно для решения этой проблемы.
Это код, который я использую (здесь: https://fabianlee.org/2019/09/15/python-getting-live-output-from-subprocess-using-poll/):
# invoke process
process = subprocess.Popen("./test.sh", shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
# print stdout while process is still working
while True:
output = process.stdout.readline()
if process.poll() is not None:
break
if output:
print("out:", output.strip())
rc = process.poll()
if rc == 0:
print("Process ended with rc:", rc, "output:", output)
else:
print("Process ended with rc:", rc, "error:", process.stderr.readline())
Когда я использую этот простой сценарий bash в качестве аргумента, он работает как шарм:
#!/bin/bash
for i in $(seq 1 5); do
echo "iteration" $i
sleep 1
done
что дает результат:
out: iteration 1
out: iteration 2
out: iteration 3
out: iteration 4
out: iteration 5
Process ended with rc: 0 output:
или это, если я намеренно вставляю ошибку в скрипт, например:
Process ended with rc: 2 error: ./test.sh: line 7: syntax error: unexpected end of file
Hovever, когда я пробую его с (в данном случае picard ValidateSamFile), он не дает мне livefeed, что бы я ни пробовал:
# invoke process
process = subprocess.Popen("picard ValidateSamFile -I dna_seq/aligned/2064-01/AHWM2NCCXY.RJ-1967-2064-01.6.bam", shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
# print stdout while process is still working
while True:
output = process.stdout.readline()
if process.poll() is not None:
break
if output:
print("out:", output.strip())
rc = process.poll()
if rc == 0:
print("Process ended with rc:", rc, "output:", output)
else:
print("Process ended with rc:", rc, "error:", process.stderr.readline())
Я получаю это после завершения процесса:
out: No errors found
Process ended with rc: 0 output:
Любые идеи? Я был бы очень рад, если бы вы мне помогли с этим!:)
С уважением / Йонас