Как я могу дублировать sys.стандартный вывод в лог-файл в Python?



Edit: поскольку кажется, что либо нет решения, либо я делаю что-то настолько нестандартное, что никто не знает - я пересмотрю свой вопрос, чтобы также спросить: каков лучший способ выполнить ведение журнала, когда приложение python делает много системных вызовов?

мое приложение имеет два режима. В интерактивном режиме я хочу, чтобы все выходные данные шли на экран, а также в файл журнала, включая вывод из любых системных вызовов. В режиме демона все выходные данные поступают в журнал. Демон режим отлично работает с помощью os.dup2(). Я не могу найти способ "tee" все выходные данные для входа в интерактивный режим, не изменяя каждый системный вызов.


другими словами, Я хочу, чтобы функциональность командной строки "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())

хорошая вещь об этом является то, что он требует никаких специальных вызовов печати из остальной части кода. Код также запускает некоторые команды оболочки, поэтому приятно не иметь дело с каждым из их выходных данных по отдельности.

просто, я хочу сделать то же самое, за исключением дублирующего вместо перенаправления.

сначала подумал, что я думал, что просто перевернув 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)

файл "a.log" должен быть идентичен тому, что было показано на кино.

183   0  
    Ничего не найдено.

Добавить ответ:
Отменить.