我正在使用mod_wsgi并且想知道是否可以覆盖print()命令(因为它没用)。
这样做不起作用:
print = myPrintFunction
因为这是语法错误。 :(
答案 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