Pregunta

Estoy usando mod_wsgi y me preguntaba si es posible sobre-escribir el comando de impresión () (ya que es inútil).

Hacer esto no funciona:

print = myPrintFunction

Dado que se trata de un error de sintaxis. : (

¿Fue útil?

Solución

impresión no es una función en Python 2.x, así que esto no es directamente posible.

Puede, sin embargo, anular sys.stdout .

Si usted está en Python 3.0 en los de impresión es ahora una función lo que tiene que trabajar entonces, suponiendo que tiene la firma correcta. También ver una pregunta relacionada en este sitio.

Otros consejos

¿Podría

import sys
sys.stdout = MyFileWrapper()

o algo un trabajo similar?

Si está utilizando 3.0, la impresión es una función. Si está utilizando 2.6, puede from __future__ import print_function y continuar con una función de impresión.

Si <= 2,5, puede reemplazar la salida estándar como otros han sugerido, pero tenga mucho cuidado si su servidor wsgi llamará a su aplicación en múltiples hilos simultáneamente. se terminar con peticiones simultáneas que se envían por la misma tubería.

Yo no lo he probado, pero se puede intentar algo como esto:

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.

Es de destacar que el uso de 'imprimir' a sys.stdout en Apache / mod_wsgi estaba restringido deliberadamente. Esto se debe a una aplicación WSGI portátil no debe utilizar sys.stdin o sys.stdout como algunas implementaciones WSGI los utilizan para comunicarse con el servidor.

Por lo tanto,

Apache / mod_wsgi está tratando de forzarlo a escribir una aplicación WSGI tal que será portable a otras implementaciones WSGI.

Desafortunadamente, muchas personas parecen no preocuparse acerca de cómo escribir un buen código y así mod_wsgi 3.0 le permitirá escribir a sys.stdout y por lo tanto utilizar 'imprimir' sin redirigir la salida a 'sys.stderr' como que debería estar haciendo.

De cualquier manera, se detalla la documentación mod_wsgi cómo eliminar la restricción en las versiones de mod_wsgi antes de 3.0. En particular, consulte la documentación sobre la directiva WSGIRestrictStdout. La documentación acerca de las técnicas de depuración también habla sobre el tema y sobre sys.stdout mapeo a sys.stderr.

Puede leer un comentario que resume esta cuestión en:

http: // Blog .dscpl.com.au / 2009/04 / wsgi-y-impresión-a-norma-output.html

Si bien se puede redirigir la salida estándar de diferentes fuentes como el archivo de registro, como se menciona Paolo, es probable que no lo necesitan. Yo no lo necesitaba. Si realmente se necesita para registrar cosas, que sería el uso de la tala en sí, en primer lugar, ¿verdad? Además, incluso cuando no imprima una cosa, las bibliotecas de terceros que use pueden hacer. Sólo redirigirlo y ponerse en marcha.

La solución más sencilla a este problema es para redirigir todo el stdout en stderr. En el fichero de configuración wsgi, simplemente redirigir según sea necesario.

sys.stdout = sys.stderr
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top