Python - Переопределение печати () - PullRequest
4 голосов
/ 21 апреля 2009

Я использую mod_wsgi и мне было интересно, можно ли перезаписать команду print () (поскольку она бесполезна).

Это не работает:

print = myPrintFunction

Так как это синтаксическая ошибка. (

Ответы [ 5 ]

13 голосов
/ 21 апреля 2009

Печать не является функцией в Python 2.x, так что это невозможно напрямую.

Однако вы можете переопределить sys.stdout .

Если вы работаете на Python 3.0, в котором print теперь является функцией , то то, что у вас будет работать, при условии, что у вас правильная подпись. Также см. связанный вопрос на этом сайте.

5 голосов
/ 21 апреля 2009

Будет

import sys
sys.stdout = MyFileWrapper()

или что-то подобное работает?

1 голос
/ 24 июня 2009

Стоит отметить, что использование 'print' для sys.stdout в Apache / mod_wsgi было преднамеренно ограничено. Это связано с тем, что переносимое приложение WSGI не должно использовать ни sys.stdin, ни sys.stdout, так как некоторые реализации WSGI используют их для связи с сервером.

Поэтому Apache / mod_wsgi пытается заставить вас написать ваше приложение WSGI так, чтобы оно было переносимым на другие реализации WSGI.

К сожалению, слишком много людей, похоже, не заботятся о написании хорошего кода, и поэтому mod_wsgi 3.0 позволит вам писать в sys.stdout и, таким образом, использовать «печать», не перенаправляя вывод в «sys.stderr», как вам следует делать.

В любом случае, в документации mod_wsgi подробно описано, как снять ограничение в версиях mod_wsgi до 3.0. В частности, см. Документацию о директиве WSGIRestrictStdout. В документации о методах отладки также говорится о проблеме и о сопоставлении sys.stdout с sys.stderr.

Комментарий к этой проблеме можно прочитать по адресу:

http://blog.dscpl.com.au/2009/04/wsgi-and-printing-to-standard-output.html

1 голос
/ 21 апреля 2009

Если вы используете 3.0, печать - это функция. Если вы используете 2.6, вы можете from __future__ import print_function и продолжить работу с функцией печати. ​​

Если <= 2.5, вы можете заменить стандартный вывод, как предлагали другие, но будьте очень осторожны, если ваш сервер wsgi будет вызывать ваше приложение одновременно в нескольких потоках. Вы <strong>БУДЕТ в конечном итоге с одновременными запросами отправляются по той же трубе.

Я не проверял это, но вы можете попробовать что-то вроде этого:

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.
0 голосов
/ 30 ноября 2009

Хотя вы можете перенаправить стандартный вывод в разные источники, например, в файл для регистрации, как упоминает Паоло, вам, вероятно, это не понадобится. Мне это не нужно. Если бы вам действительно нужно было что-то регистрировать, вы бы использовали саму регистрацию, не так ли? Кроме того, даже когда вы ничего не печатаете, сторонние библиотеки, которые вы используете, могут это делать. Просто перенаправьте его и начинайте.

Самое простое решение этой проблемы - перенаправить весь стандартный вывод в стандартный поток ошибок. В файле конфигурации wsgi просто перенаправьте при необходимости.

sys.stdout = sys.stderr
...