4

私は mod_wsgi を使用しており、print() コマンドを上書きできるかどうか疑問に思っていました (役に立たないため)。

これを行うとうまくいきません:

print = myPrintFunction

構文エラーなので。:(

4

5 に答える 5

13

Print は Python 2.x の関数ではないため、これを直接行うことはできません。

ただし、sys.stdout をオーバーライドできます。

print が関数になっているPython 3.0を使用している場合、正しい署名があると仮定すると、機能します。このサイトの関連する質問も参照してください。

于 2009-04-21T00:56:16.143 に答える
6

だろう

import sys
sys.stdout = MyFileWrapper()

または何か似たような仕事?

于 2009-04-21T00:56:06.377 に答える
1

Apache/mod_wsgi の sys.stdout への「print」の使用が意図的に制限されたことは注目に値します。これは、一部の WSGI 実装がサーバーとの通信に使用するため、移植可能な WSGI アプリケーションは sys.stdin または sys.stdout を使用すべきではないためです。

したがって、Apache/mod_wsgi は、他の WSGI 実装に移植できるように WSGI アプリケーションを作成するよう強制しようとしています。

残念ながら、あまりにも多くの人が良いコードを書くことを気にしていないようです。そのため、mod_wsgi 3.0 では sys.stdout に書き込むことができるようになり、出力を「sys.stderr」にリダイレクトすることなく「print」を使用できるようになります。

いずれにせよ、mod_wsgi のドキュメントには、3.0 より前のバージョンの mod_wsgi で制限を削除する方法が詳しく説明されています。特に、WSGIRestrictStdout ディレクティブに関するドキュメントを参照してください。デバッグ手法に関するドキュメントでは、この問題と sys.stdout から sys.stderr へのマッピングについても説明しています。

この問題を要約した解説は、次の場所で読むことができます。

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

于 2009-06-24T11:43:58.320 に答える
1

3.0 を使用している場合、print は関数です。2.6 を使用している場合はfrom __future__ import print_function、印刷機能を続行できます。

<= 2.5 の場合、他の人が提案したように stdout を置き換えることができますが、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.
于 2009-04-21T15:40:05.330 に答える
0

パオロが言及しているように、ロギング用のファイルなどのさまざまなソースにstdoutをリダイレクトできますが、おそらく必要ないでしょう。私はそれを必要としませんでした。何かを本当にログに記録する必要がある場合は、そもそもログ自体を使用しているのではないでしょうか? また、何かを印刷しなくても、使用しているサードパーティのライブラリが印刷できる場合があります。リダイレクトして開始するだけです。

この問題に対する最も簡単な解決策は、すべての stdout を stderr にリダイレクトすることです。wsgi 構成ファイルで、必要に応じてリダイレクトするだけです。

sys.stdout = sys.stderr
于 2009-11-30T08:49:04.943 に答える