Domanda

Sto utilizzando mod_wsgi e chiedevo se è possibile a un eccesso di scrivere il comando di stampa () (dal momento che è inutile).

In questo modo non funziona:

print = myPrintFunction

Dal momento che è un errore di sintassi. : (

È stato utile?

Soluzione

Stampa non è una funzione in Python 2.x, quindi questo non è direttamente possibile.

È possibile, tuttavia, ignorare sys.stdout .

Se siete su Python 3.0 in cui stampa è ora una funzione quello che hai sarebbe poi lavorare, a patto di avere la firma giusta. Anche vedere una questione connessa in questo sito.

Altri suggerimenti

Sarebbe

import sys
sys.stdout = MyFileWrapper()

o qualcosa di simile lavoro?

Se si utilizza 3.0, la stampa è una funzione. Se si utilizza 2.6, è possibile from __future__ import print_function e continuare con una funzione di stampa.

Se <= 2.5, è possibile sostituire stdout come altri hanno suggerito, ma essere molto attenti se il server WSGI chiamerà la tua applicazione in più thread contemporaneamente. È finire con richieste simultanee vengono inviati verso il basso lo stesso tubo.

Non ho ancora testato, ma si potrebbe provare qualcosa di simile:

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.

Vale la pena notare che l'uso di 'print' per sys.stdout in Apache / mod_wsgi è stato deliberatamente limitato. Questo perché un'applicazione WSGI portatile non deve utilizzare sys.stdin o sys.stdout come alcune implementazioni WSGI li utilizzano per comunicare con il server.

Apache / mod_wsgi è quindi cercando di costringere a scrivere l'applicazione WSGI in modo tale che sarà portabile su altre implementazioni WSGI.

Purtroppo, troppe persone sembrano non preoccuparsi di scrivere buon codice e così mod_wsgi 3.0 vi permetterà di scrivere a sys.stdout e quindi utilizzare 'stampa', senza reindirizzare l'uscita di 'sys.stderr' come si dovrebbe fare.

In entrambi i casi, la documentazione mod_wsgi dettagli come rimuovere la limitazione nelle versioni di mod_wsgi precedenti alla 3.0. In particolare, vedere la documentazione sulla direttiva WSGIRestrictStdout. La documentazione sulle tecniche di debugging parla anche della questione e sulla mappatura sys.stdout per sys.stderr.

Si può leggere un commento che riassume la questione in:

http: // blog .dscpl.com.au / 2009/04 / WSGI-e-stampa-to-standard output.html

Mentre è possibile reindirizzare stdout a fonti diverse, come il file per la registrazione, come cita Paolo, probabilmente non avrebbe bisogno di esso. Non ne avevo bisogno. Se davvero bisogno di accedere roba, si sarebbe utilizzando per sé la registrazione, in primo luogo, non è vero? Inoltre, anche quando non stampare una cosa, le librerie di terze parti usati possono fare. Basta destinarli e andare avanti.

La soluzione più semplice a questo problema è quello di reindirizzare tutto stdout in stderr. Nel file di configurazione WSGI, proprio reindirizzare se necessario.

sys.stdout = sys.stderr
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top