Heroku を使用して Python で Web アプリを作成していますが、デバッグを効果的にテストする方法がわかりません。print(...) と sys.stdout.write(...) を使用してみましたが、「foreman start」を使用してローカルで実行したとき、またはクラウドにデプロイして「heroku ログ」を実行したときに出力が表示されません。クラウド ログ。さらに、例外が発生した場合などの Python ランタイム エラーをデバッグする方法がわかりません。アプリの Web リクエストは HTTP 500 を返しますが、それをデバッグして例外の発生場所を確認する方法がありません。この情報を見る方法はありますか?
3 に答える
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()
Foreman を使用して Python プロジェクトを実行していて、stdout/stderr の表示に問題がある場合は、いくつかの解決策があります。Procfile を使用して Python CLI を直接呼び出す場合は、'-u' オプションを使用して stdout バッファリングを回避できます。
python -u script.py
ガンコーン、フラスコ、ボトル、イブなどの呼び出しなど、Procfile を使用して WSGI サーバーを管理している場合は、「.env」ファイルを Python プロジェクトのルートに追加できます。これには、次のものが含まれます。
PYTHONUNBUFFERED=True
この質問への回答も参照してください。 職長は「started wit pid #」の行のみを表示し、他には何も表示しません
他の Django/Python の初心者に注意してください。追加することを忘れないでください
import sys
そして、このようなもの
print ("hello world") # python 3
sys.stdout.flush()
コンソールに出力されます。
PHP から Py/Dj KISS に移行することはめったにありません。