4

我正在使用 mod_wsgi 并且想知道是否可以覆盖 print() 命令(因为它没用)。

这样做不起作用:

print = myPrintFunction

因为这是一个语法错误。:(

4

5 回答 5

13

Print 在 Python 2.x 中不是一个函数,所以这不是直接可能的。

但是,您可以覆盖 sys.stdout

如果您使用的是 Python 3.0,其中print 现在是一个函数,那么假设您有正确的签名,您将可以使用它。另请参阅此站点中的相关问题

于 2009-04-21T00:56:16.143 回答
6

import sys
sys.stdout = MyFileWrapper()

或类似的工作?

于 2009-04-21T00:56:06.377 回答
1

如果您使用的是 3.0,则 print 是一个函数。如果您使用的是 2.6,您可以from __future__ import print_function继续使用打印功能。

如果 <= 2.5,您可以像其他人建议的那样替换 stdout,但如果您的 wsgi 服务器会同时在多个线程中调用您的应用程序,请务必小心。您最终将通过同一管道发送同时请求。

我还没有测试过,但你可以尝试这样的事情:

import sys
import threading

class ThreadedStdout(object):
    def __init__(self):
        self.local = threading.local()
    def register(self, fh):
        self.local.fh = fh
    def write(self, stuff):
        self.local.fh.write(stuff)

sys.stdout = ThreadedStdout()

def app(environ, start):
    sys.stdout.register(environ['wsgi.stdout'])

    # Whatever.
于 2009-04-21T15:40:05.330 回答
1

值得注意的是,在 Apache/mod_wsgi 中对 sys.stdout 使用“打印”是故意限制的。这是因为可移植的 WSGI 应用程序不应使用 sys.stdin 或 sys.stdout,因为某些 WSGI 实现使用它们与服务器通信。

因此,Apache/mod_wsgi 试图强迫您编写 WSGI 应用程序,以便将其移植到其他 WSGI 实现。

不幸的是,似乎有太多人不关心编写好的代码,因此 mod_wsgi 3.0 将允许您写入 sys.stdout 并因此使用 'print' 而不会像您应该做的那样将输出重定向到 'sys.stderr'。

无论哪种方式,mod_wsgi 文档都详细说明了如何在 3.0 之前的 mod_wsgi 版本中删除限制。特别是,请参阅有关 WSGIRestrictStdout 指令的文档。有关调试技​​术的文档还讨论了该问题以及将 sys.stdout 映射到 sys.stderr。

您可以在以下位置阅读总结此问题的评论:

http://blog.dscpl.com.au/2009/04/wsgi-and-printing-to-standard-output.html

于 2009-06-24T11:43:58.320 回答
0

虽然您可以将标准输出重定向到不同的来源,例如用于记录的文件,正如 Paolo 所提到的,但您可能不需要它。我不需要它。如果你真的需要记录东西,你会首先使用记录本身,不是吗?此外,即使不打印任何东西,您使用的第三方库也可能会打印。只需重定向它并开始。

解决这个问题最简单的方法是将所有标准输出重定向到标准错误。在 wsgi 配置文件中,根据需要进行重定向。

sys.stdout = sys.stderr
于 2009-11-30T08:49:04.943 回答