Python - 覆盖print()

时间:2009-04-21 00:53:23

标签: python python-3.x mod-wsgi wsgi

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

这样做不起作用:

print = myPrintFunction

因为这是语法错误。 :(

5 个答案:

答案 0 :(得分:13)

Print不是Python 2.x中的函数,因此这不是直接可行的。

但是,您可以override sys.stdout

如果您使用的是Python 3.0,那么print is now a function您拥有的内容将会起作用,假设您拥有正确的签名。另请参阅此站点中的a related question

答案 1 :(得分:5)

import sys
sys.stdout = MyFileWrapper()

或类似的工作?

答案 2 :(得分:1)

如果您使用3.0,则打印是一项功能。如果您使用的是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.

答案 3 :(得分:1)

值得注意的是,故意限制在Apache / mod_wsgi中对sys.stdout使用'print'。这是因为可移植的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

答案 4 :(得分:0)

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

解决此问题的最简单方法是将所有stdout重定向到stderr。在wsgi配置文件中,只需根据需要重定向。

sys.stdout = sys.stderr
相关问题