2

我正在编写一个基于 Django 的 webapp,它通过 PyObjC 导入一个 Cocoa 框架。Cocoa 框架NSLog()随处可见,虽然我可以在非守护程序模式下运行 Django 服务器时看到它们,但一旦我进入守护程序,我就会失去所有这些有用NSLog()的输出。

有没有什么简单的方法可以让 NSLog 的东西冒泡到 Pythonlogging模块的世界中,这样它就可以与实际 Python 代码发出的日志消息合并?

做了一点谷歌搜索,似乎您可能必须重定向 stderr 并以某种方式将其吸回到 Python 中才能实现这一目标,这有点令人遗憾......

非常感谢任何帮助。

4

1 回答 1

3

根据this page,NSLog基本上像

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

所以你确实需要捕获/重定向标准错误输出。我前段时间写了一篇文章,可能对纯 Python 程序有所帮​​助,但我猜想 Cocoa 代码在后台访问进程级文件描述符 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 代码和 Cocoa 代码的输出的一种方法。

于 2010-10-15T23:20:43.300 回答