Я пытаюсь просмотреть результаты в реальном времени из подпроцесса в режиме реального времени. Я попробовал несколько методов здесь, но они не работали для меня. Теперь у меня есть метод, который работает, но он заставляет мою программу завершать работу сразу после успешного завершения подпроцесса. Я получаю код возврата ноль. Команда запускается внутри тюрьмы 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 ответа
Как указал @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"
Я думаю, что вы хотели отключить 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, которую вы хотите получить позже.
Похожие вопросы
Новые вопросы
python
Python - это многопарадигмальный, динамически типизированный, многоцелевой язык программирования. Он разработан для быстрого изучения, понимания и использования, а также для обеспечения чистого и единообразного синтаксиса. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Тем не менее, для вопросов о Python, связанных с версией, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas и NumPy) включите его в теги.