11.1.8 CGIスクリプトのデバッグ

まず最初に、くだらないインストールのエラーをチェックしてください - ほとんどの場合、「CGIスクリプトのインストール」の章を注意深く読めば解決するでしょう。 インストールの手順を正しく理解できているかどうか自信がない場合は、 `cgi.py'モジュールのコピーをCGIスクリプトとしてインストールしてみてください。 スクリプトを呼び出したとき、環境(変数)とHTMLフォームの内容がダンプされるはずです。 モードやその他を正しくセットして、リクエストを送ります。 スクリプトが標準的な `cgi-bin'ディレクトリにインストールされていれば、 ブラウザに URLを入力してリクエストを送ることができるはずです:

http://yourhostname/cgi-bin/cgi.py?name=Joe+Blow&addr=At+Home

もし、タイプ404のエラーが起きたら、サーバがスクリプトを見つけられていません - 多分スクリプトを別のディレクトリにインストールする必要があります。 もし、それ以外のエラー(500とか)なら、他の方法を試す前にインストールの問題を解決する 必要があります。 うまいことフォーマットされた環境(変数)とフォームの内容が (この例では、``addr'' は ``At Home''、``name'' が ``Joe Blow''になります) 表示されれば、`cgi.py'スクリプトは正しくインストールされています。 次に、同じことをあなたの作ったスクリプトでやってみればデバッグできるでしょう。

次のステップでは、あなたのスクリプトからcgi モジュールの test() 関数を呼んでみます: メインの部分を次のステートメントで置き換えます。

cgi.test()

この結果は、`cgi.py'をインストールして得たものと同じになるはずです。

普通のパイソンスクリプトなら、unhandled例外を起こしたとき、 (例えば、モジュール名のタイプミスなどでファイルが開けないケースとか) パイソン・インタープリタはわかりやすいトレースバックを出力して終了します。 CGIスクリプトが例外を起こしたとき、パイソン・インタープリタがまだ実行中なら、 トレースバックがサーバのログの一つに残るか、まったく捨てられてしまうでしょう。

幸運にも、一度どうにかこうにか何らかのコードを実行できるスクリプトができたら、 例外やトレースバックの出力を捕まえるのは簡単です。

1.
トレースバックモジュールをインポートする (try ... except構文の前に!)

2.
sys.stderrsys.stdoutに割り当てる

3.
ヘッダと空行を出力することを確認する

4.
残りのコードはすべて try ... exceptステートメントの中に入れる

5.
except節のなかで、traceback.print_exc()を呼び出す

例:

import sys
import traceback
print "Content-type: text/html"
print
sys.stderr = sys.stdout
try:
    ...以下、あなたのプログラム...
except:
    print "\n\n<PRE>"
    traceback.print_exc()

注意: sys.stderrへの割り当てはトレースバックが出力をsys.stderrに 書き込むので必要です。 print "\n\n<PRE>"ステートメントは、 HTMLのワードラップを止めるために必要です。

もしトレースバックモジュールのインポート自体に問題があると考えられる場合、 もっと強力なアプローチが使えます(ビルトイン・モジュールの場合のみ)。

import sys
sys.stderr = sys.stdout
print "Content-type: text/plain"
print
...以下、あなたのプログラム...

トレースバックの出力はパイソン・インタープリタによって実行されます。 出力のタイプがテキストに設定されると、すべてのHTMLプロセスは無効になります。 スクリプトが実行されると、クライアントには生のHTMLが出力されることになります。 例外が起これば、おそらく最初の2行が出力された後、トレースバックが表示されます。 HTMLインタプリタが働かないため、トレースバックを読むことができます。

guido@python.org