Я пытаюсь просмотреть результаты в реальном времени из подпроцесса в режиме реального времени. Я попробовал несколько методов здесь, но они не работали для меня. Теперь у меня есть метод, который работает, но он заставляет мою программу завершать работу сразу после успешного завершения подпроцесса. Я получаю код возврата ноль. Команда запускается внутри тюрьмы FreeBSD (например, chroot) и на самом деле работает, она просто завершает работу до завершения остальной части программы.

 import os, sys, subprocess

 DEVNULL = open(os.devnull, 'w')
 save = DEVNULL

 tick = re.escape("'")
 Jcmd = "jexec 1 sh -c '/usr/local/bin/aria2c --quiet=false -x 10 " + re.escape(links[1]) + tick
 proc = subprocess.Popen(Jcmd, shell=True)
 returncode = proc.wait()
 print "RETURN CODE: ", returncode
 sys.stdout = save
 print "THIS PRINT STATEMENT DOES NOT EXECUTE, PYTHON EXITS BEFORE"


OUTPUT:

Download Results:
gid   |stat|avg speed  |path/URI
======+====+===========+=======================================================
c28be0|OK  |       0B/s|/usr/local/MOUNTPOINTS/_DOWNLOADS/document.pdf

Status Legend:
(OK):download completed.
RETURN CODE:  0
2
sdproto 24 Апр 2017 в 13:31

2 ответа

Лучший ответ

Как указал @Kenny, я перенаправил sys.stdout, и моя программа фактически продолжала делать что-то после sys.stdout = save. После этого я добавил эту строку для восстановления вывода на экран: sys.stdout = sys. stdout . Вот и все:

import os, sys, subprocess

 # Next 2 lines not needed
 # DEVNULL = open(os.devnull, 'w')
 # save = DEVNULL

 tick = re.escape("'")
 Jcmd = "jexec 1 sh -c '/usr/local/bin/aria2c --quiet=false -x 10 " + re.escape(links[1]) + tick
 proc = subprocess.Popen(Jcmd, shell=True)
 returncode = proc.wait()
 print "RETURN CODE: ", returncode

 # Next 2 lines not needed
 #sys.stdout = save
 #sys.stdout = sys.__stdout__

 print "THIS PRINT STATEMENT DOES NOT EXECUTE, PYTHON EXITS BEFORE"
1
sdproto 24 Апр 2017 в 21:12

Я думаю, что вы хотели отключить stdout во время выполнения вашего другого процесса, чтобы предотвратить попадание вывода Python в вывод вывода подпроцесса. Тем не менее, это может быть ненужным, поскольку ваш код на Python просто ждет, поэтому он все равно ничего не может напечатать.

Если вы хотите заставить замолчать отпечатки на питоне, а затем восстановить их, это будет выглядеть примерно так:

import os, sys
with open(os.devnull, 'w') as DEVNULL:
    save = sys.stdout # this is what you want to restore later
    sys.stdout = DEVNULL
    print "this prints to devnull (not really)"
    sys.stdout = save # restore the original sys.stdout

print "this prints to stdout"

Обратите внимание, что save - это временная переменная для реального sys.stdout, которую вы хотите получить позже.

0
Kenny Ostrom 24 Апр 2017 в 20:54