Pergunta

Eu estou usando mod_wsgi e queria saber se é possível sobre-escrever o comando de impressão () (uma vez que é inútil).

Fazendo isso não funciona:

print = myPrintFunction

Uma vez que é um erro de sintaxe. : (

Foi útil?

Solução

Imprimir não é uma função em Python 2.x, de modo que este não é diretamente possível.

Você pode, no entanto, override sys.stdout .

Se você estiver em Python 3.0 em que impressão agora é uma função o que você tem, então, trabalho, supondo que você tem a assinatura correta. Veja também uma pergunta relacionada neste site.

Outras dicas

Would

import sys
sys.stdout = MyFileWrapper()

ou algo trabalho semelhante?

Se você estiver usando 3.0, de impressão é uma função. Se você estiver usando 2.6, você pode from __future__ import print_function e continuar com a função de impressão.

Se <= 2,5, você pode substituir stdout como já foi sugerido, mas ter muito cuidado se o seu servidor wsgi vai chamar a sua aplicação em múltiplas threads simultaneamente. Você acabar com solicitações simultâneas sendo enviados pelo mesmo tubo.

Eu não testei, mas você pode tentar algo como isto:

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 a pena notar que o uso de 'print' para sys.stdout em Apache / mod_wsgi foi deliberadamente restrito. Isso ocorre porque uma aplicação WSGI portátil não deve usar qualquer sys.stdin ou sys.stdout como alguns WSGI implementações usá-los para se comunicar com o servidor.

Apache / mod_wsgi é, portanto, tentando forçá-lo a escrever a sua aplicação WSGI de tal forma que ele vai ser portável para outras implementações WSGI.

Infelizmente, muitas pessoas parecem não se importar sobre como escrever código bom e tão mod_wsgi 3.0 permitirá que você escreva para sys.stdout e, assim, usar 'print' sem redirecionar a saída para 'sys.stderr' como você deveria estar fazendo.

De qualquer maneira, os mod_wsgi detalhes de documentação como remover a restrição em versões do mod_wsgi anteriores à 3.0. Em particular, consulte a documentação sobre a directiva WSGIRestrictStdout. A documentação sobre técnicas de depuração também fala sobre o assunto e sobre o mapeamento sys.stdout para sys.stderr.

Você pode ler um comentário que resume esta questão em:

http: // blogue .dscpl.com.au / 2009/04 / wsgi-e-imprimir-to-padrão da output.html

Enquanto você pode redirecionar stdout para diferentes fontes como arquivo para registro, como Paolo menciona, você provavelmente não iria precisar dele. Eu não precisava disso. Se você realmente necessário para o material de registro, você estaria usando registrando-se, em primeiro lugar, não é? Além disso, mesmo quando Você não imprimem uma coisa, as bibliotecas de terceiros que você usa pode fazer. Apenas redirecioná-lo e ir em frente.

A solução mais simples para este problema é para redirecionar todo o stdout em stderr. No arquivo de configuração wsgi, apenas redirecioná conforme necessário.

sys.stdout = sys.stderr
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top