Как дублировать sys.stdout в файл журнала?Python

Программы на Python
Anonymous
Как дублировать sys.stdout в файл журнала?

Сообщение Anonymous »

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

Мое приложение имеет два режима. В интерактивном режиме я хочу, чтобы весь вывод выводился на экран, а также в файл журнала, включая вывод любых системных вызовов. В режиме демона весь вывод записывается в журнал. Режим демона отлично работает с использованием 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)
Файл «a.log» должен быть идентичен тому, что отображалось на экране.

Подробнее здесь: https://stackoverflow.com/questions/616 ... a-log-file

Вернуться в «Python»