Вопрос

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

Делать это не сработает:

print = myPrintFunction

Поскольку это синтаксическая ошибка.:(

Это было полезно?

Решение

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

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

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

Другие советы

Бы

import sys
sys.stdout = MyFileWrapper()

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

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

Если <= 2.5, вы можете заменить стандартный вывод, как предлагали другие, но будьте очень осторожны, если ваш сервер 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.

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

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

К сожалению, слишком много людей, похоже, не заботятся о написании хорошего кода, и поэтому mod_wsgi 3.0 позволит вам записывать в sys.stdout и, таким образом, использовать 'print' без перенаправления вывода в '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

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

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

sys.stdout = sys.stderr
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top