我正在使用 mod_wsgi,想知道是否有可能覆盖 print() 命令(因为它无用)。
尝试这样做是不起作用的:
print = myPrintFunction
由于这是语法错误。 :(
我正在使用 mod_wsgi,想知道是否有可能覆盖 print() 命令(因为它无用)。
尝试这样做是不起作用的:
print = myPrintFunction
由于这是语法错误。 :(
在Python 2.x中,Print不是一个函数,因此这不是直接可能的。
但是,您可以覆盖sys.stdout。
如果您使用的是Python 3.0,其中print现在是一个函数,假设您有正确的签名,则您所拥有的将会起作用。此外,请参阅本站相关问题。
Would
import sys
sys.stdout = MyFileWrapper()
如果你使用的是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.
http://blog.dscpl.com.au/2009/04/wsgi-and-printing-to-standard-output.html
虽然您可以将stdout重定向到不同的源,例如文件进行日志记录,正如Paolo所提到的那样,但您可能不需要它。我没有需要它。如果您真的需要记录一些东西,您首先会使用logging本身,不是吗?此外,即使您什么也不打印,您使用的第三方库可能会这样做。只需重定向并继续。
解决此问题的最简单方法是将所有stdout重定向到stderr。在wsgi配置文件中,根据需要进行重定向即可。
sys.stdout = sys.stderr