Почему 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:

Любые идеи? Я был бы очень рад, если бы вы мне помогли с этим!:)

С уважением / Йонас

0 ответов

Другие вопросы по тегам