Как заставить NSLog работать с модулем журналирования Python при использовании PyObjC? - PullRequest
1 голос
/ 12 октября 2010

Я пишу основанное на Django веб-приложение, которое импортирует инфраструктуру Какао через PyObjC.Платформа Cocoa все время засоряется NSLog(), и, хотя я вижу их при запуске сервера Django в не-демоническом режиме, как только я перехожу к демону, я просто теряю весь этот полезный вывод NSLog().

Есть ли какой-нибудь простой способ заставить NSLog всплыть в мир модуля Python logging, чтобы его можно было объединить с сообщениями журнала, генерируемыми реальным кодом Python?

Небольшое гуглениеи кажется, что вам, возможно, придется перенаправить stderr и каким-то образом высосать его обратно в Python, чтобы добиться этого, что было бы отчасти обломком ...

Любая помощь очень ценится.

1 Ответ

2 голосов
/ 16 октября 2010

Согласно этой странице NSLog в основном работает как

fprintf(stderr, format_string, args ...);

, поэтому вам нужно перехватить / перенаправить стандартный вывод ошибок.Некоторое время назад я написал сообщение , которое могло бы помочь программам только на Python, но я предполагаю, что код Какао получает доступ к дескриптору файла 2 уровня процесса (stderr) под прикрытием.Так что вам нужно немного поиграться с процессом 'stderr.Вот пример:

old_stderr = os.dup(sys.stderr.fileno()) # keep a copy
fd = os.open('path/to/mylog', os.O_CREAT | os.O_WRONLY)
os.dup2(fd, sys.stderr.fileno())
# Now, stderr output, including NSLog output, should go to 'path/to/mylog'
...
os.dup2(old_stderr, sys.stderr.fileno())
#stderr restored to its old state

Когда у вас есть fd, вы можете создать из него файлоподобный объект и передать его, например, StreamHandler в качестве средства объединения выходных данных изКод Python и код Какао.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...