Мое приложение имеет два режима. В интерактивном режиме я хочу, чтобы весь вывод выводился на экран, а также в файл журнала, включая вывод любых системных вызовов. В режиме демона весь вывод записывается в журнал. Режим демона отлично работает с использованием os.dup2(). Я не могу найти способ "перевести" весь вывод в журнал в интерактивном режиме, не изменяя каждый системный вызов.
Другими словами, мне нужна функциональность командной строки «tee» для любого вывода, генерируемого приложением Python, включая вывод системного вызова.
Чтобы уточнить:
Чтобы перенаправить весь вывод, я делаю что-то вроде этого, и это отлично работает:
Код: Выделить всё
# open our log file
so = se = open("%s.log" % self.name, 'w', 0)
# re-open stdout without buffering
sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0)
# redirect stdout and stderr to the log file opened above
os.dup2(so.fileno(), sys.stdout.fileno())
os.dup2(se.fileno(), sys.stderr.fileno())
Просто я хочу сделать то же самое, за исключением < em>дублирование вместо перенаправления.
Сначала я подумал, что простое обращение dup2 должно сработать. Почему нет? Вот мой тест:
Код: Выделить всё
import os, sys
### my broken solution:
so = se = open("a.log", 'w', 0)
sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0)
os.dup2(sys.stdout.fileno(), so.fileno())
os.dup2(sys.stderr.fileno(), se.fileno())
###
print("foo bar")
os.spawnve("P_WAIT", "/bin/ls", ["/bin/ls"], {})
os.execve("/bin/ls", ["/bin/ls"], os.environ)
Подробнее здесь: https://stackoverflow.com/questions/616 ... a-log-file