Python - 覆盖 print()

4

我正在使用 mod_wsgi,想知道是否有可能覆盖 print() 命令(因为它无用)。

尝试这样做是不起作用的:

print = myPrintFunction

由于这是语法错误。 :(


只是针对Python新手并且为了减少可能会让新编程人员困惑的事情;原帖提到了“print()命令”。Python有一些无法被覆盖的语句。Python也有函数;其中一些是内置的。Python没有任何“命令”。但是在这种情况下,“someword()”或者说“print()”的语法告诉其他Python开发人员,“someword”是一个函数,而不是语句,因为它以括号“()”结尾。函数,即使是内置的,也可以被覆盖。这个评论只是为了澄清。 - DevPlayer
同样的问题;更多的帖子:https://dev59.com/o3RB5IYBdhLWcg3wr48V#10106489 - DevPlayer
5个回答

13

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

但是,您可以覆盖sys.stdout

如果您使用的是Python 3.0,其中print现在是一个函数,假设您有正确的签名,则您所拥有的将会起作用。此外,请参阅本站相关问题


6

Would

import sys
sys.stdout = MyFileWrapper()

或者类似的工作?

属性错误:'function'对象没有属性'write'(在调用替换时):( - Ian
取消那个,如果替换对象有一个“write()”函数,它就可以工作。太棒了。 :) - Ian

1

如果你使用的是3.0版本,print是一个函数。如果你使用的是2.6版本,你可以使用from __future__ import print_function并继续使用print函数。

如果你使用的版本小于等于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.

1
值得注意的是,在Apache/mod_wsgi中使用'print'到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之前的版本中删除限制。特别是,请参阅有关WSGIRestrictStdout指令的文档。关于调试技术的文档也谈到了这个问题,以及如何将sys.stdout映射到sys.stderr。
你可以在以下链接中阅读对此问题的评论:

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


0

虽然您可以将stdout重定向到不同的源,例如文件进行日志记录,正如Paolo所提到的那样,但您可能不需要它。我没有需要它。如果您真的需要记录一些东西,您首先会使用logging本身,不是吗?此外,即使什么也不打印,您使用的第三方库可能会这样做。只需重定向并继续。

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

sys.stdout = sys.stderr

只需使用mod_wsgi 3.0,甚至无需这样做。 - Graham Dumpleton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接