15

Heroku を使用して Python で Web アプリを作成していますが、デバッグを効果的にテストする方法がわかりません。print(...) と sys.stdout.write(...) を使用してみましたが、「foreman start」を使用してローカルで実行したとき、またはクラウドにデプロイして「heroku ログ」を実行したときに出力が表示されません。クラウド ログ。さらに、例外が発生した場合などの Python ランタイム エラーをデバッグする方法がわかりません。アプリの Web リクエストは HTTP 500 を返しますが、それをデバッグして例外の発生場所を確認する方法がありません。この情報を見る方法はありますか?

4

3 に答える 3

17

sys.stdout.flush()印刷ステートメントの後に追加すると、この問題が解決されました。

私の場合、問題は stdout がバッファリングされているのに stderr がバッファリングされていないことです。

経由で例外が表示されない場合foreman startは、実際に正しい IP/PORT でサーバーにアクセスしていることを確認してください。からの出力に、HTTP アクセス エントリ (GET /index.html など) が表示されforeman startます。

また、Web フレームワークにデバッグ モードで実行するように指示することもできます。最新のフレームワークのほとんどは、デバッグ/開発モードでブラウザーにスタック トレースを表示します。フラスコを使用していますか?app.config['DEBUG'] = Trueまたはapp.run(..., debug=True)

# logging helper
def p(*args):
  print args[0] % (len(args) > 1 and args[1:] or [])
  sys.stdout.flush()
于 2012-10-13T21:51:57.547 に答える
15

Foreman を使用して Python プロジェクトを実行していて、stdout/stderr の表示に問題がある場合は、いくつかの解決策があります。Procfile を使用して Python CLI を直接呼び出す場合は、'-u' オプションを使用して stdout バッファリングを回避できます。

python -u script.py

ガンコーン、フラスコ、ボトル、イブなどの呼び出しなど、Procfile を使用して WSGI サーバーを管理している場合は、「.env」ファイルを Python プロジェクトのルートに追加できます。これには、次のものが含まれます。

PYTHONUNBUFFERED=True

この質問への回答も参照してください。 職長は「started wit pid #」の行のみを表示し、他には何も表示しません

于 2014-01-28T04:33:19.357 に答える
9

他の Django/Python の初心者に注意してください。追加することを忘れないでください

import sys

そして、このようなもの

print ("hello world") # python 3
sys.stdout.flush()

コンソールに出力されます。

PHP から Py/Dj KISS に移行することはめったにありません。

于 2013-09-01T17:26:34.527 に答える