概要

Python で CGI を動かして軽くテストする環境を作りたい,というときの手順は,いくつかの記事に書いてある.

しかし,上手く行ったり行かなかったりしたので,メモを書いておく.

環境

  • Ubuntu 20.04.2 LTS (Focal Fossa)
    • $ cat /etc/os-release で確認
  • Python 3.8.10
    • $ python -V で確認

結論

次のような構成でディレクトリ郡を作る.

hoge/
├ main.sh
└ cgi-bin/
    ├ fuga.py
    ├ piyo.py
    ├ ...

main.sh の中身はこんな感じ.

python -m http.server 8765 --cgi

fuga.py の中身はこんな感じ.

#!/usr/bin/env python
# -*- coding:utf-8 -*-

print('Content-type: text/plain; charset=UTF-8\r\n')
print('hogehoge')

$ bash ./main.sh を実行して,Web ブラウザから http://0.0.0.0:8765/cgi-bin/fuga.py へアクセスすると,hogehoge と表示されるはず.

トラブルシューティング

OSError: [Errno 8] Exec format error

Web ブラウザから http://0.0.0.0:8765/cgi-bin/fuga.py へアクセスした瞬間,次のようなログがコンソールに出ることがある.

なお,この際,Web ブラウザへは 200 Script output follows が返されているが,これは正常な動作である.

----------------------------------------
Exception happened during processing of request from ('127.0.0.1', 34994)
Traceback (most recent call last):
  File "/home/<username>/miniconda3/envs/<envname>/lib/python3.8/http/server.py", line 1179, in run_cgi
    os.execve(scriptfile, args, env)
OSError: [Errno 8] Exec format error: '/path/to/cgi-bin/fuga.py'
----------------------------------------

上記エラーの原因は,Python スクリプトに shebang を記載していないことである.すなわち,ファイル冒頭に

#!/usr/bin/env python
# -*- coding:utf-8 -*-

を記せばよい.

レスポンスが空になっている

Web ブラウザに 200 Script output follows が返ってきているものの,レスポンスが空になっていることがある.

原因は,HTTP ヘッダを出力していないことである.すなわち,body を print するより前に,たとえば

print('Content-type: text/plain; charset=UTF-8\r\n')

を記せばよい.

その他

ページによっては,「cgi で実行しようとするスクリプトに実行権限が必要」との記載があるが,記事作成時の検証では不要だった.


以上