PythonでCGIを動かす(Python2, Python3)
import cgi
とかしてるファイルをローカルでどうやって動かすのか色々調べたメモ。
最初、Apache で動かす必要があるのかと思い、
- Running Python Programs on the macOS / Mac OS X Apache Web Server
- Mac OSX Mavericks で Apache環境構築 + 任意のディレクトリからCGIプログラムの実行まで行う. - 未来永劫
などを参考にファイルを /Library/WebServer/CGI-Executables
に置いたり
/etc/apache2/httpd.conf
の設定を変更したりしてたんですが
Python のモジュールで実現できました。
主に Python3 で動かすことを想定して調べてたんですが、Python2 でも起動はできたので両方書いておきます。
手順
ファイルの用意
cgi-bin
ディレクトリを作り、その下に実行したい Python ファイル(ここでは test.py
)を作成します。
. └── cgi-bin └── test.py
test.py
の例です。
#!/usr/bin/env python print('Content-type: text/html; charset=UTF-8\r\n') print('Hello, World!')
1行目以外は表示したいコンテンツに合わせて自由に変えて OK です。
1行目ですが、
#!/usr/bin/python
と書く方法もありますが、pyenv などでシステムデフォルトでない Python を使っている場合はこちらの方が良いです。
また、いずれも指定しなかった場合、あとでサーバーを起動してアクセスした時に
OSError: [Errno 8] Exec format error
というエラーが発生します。
ファイルを用意したらサーバーを起動します。
CGI サーバーの起動
1. Python2 の場合
SimpleHTTPServer
と同じように CGIHTTPServer
を使って以下のコマンドを実行します。
$ python -m CGIHTTPServer Serving HTTP on 0.0.0.0 port 8000 ...
2. Python3 の場合
多くのサイトでは、以下のように cgi-bin
ディレクトリと同じ階層にファイル(ここでは cgiserver.py
)を用意するように書かれています。
. ├── cgi-bin │ └── test.py └── cgiserver.py
cgiserver.py
の中身は以下の通りです。
# -*- coding: utf-8 -*- import http.server http.server.test(HandlerClass=http.server.CGIHTTPRequestHandler)
そして、このファイルを実行します。
$ python cgiserver.py Serving HTTP on 0.0.0.0 port 8000 ...
これでもいいのですが、公式ドキュメント を読むと
http.server
に --cgi
というオプションを指定する ことで
Python2 と同様ワンライナーでいけるみたいです。
$ python -m http.server --cgi Serving HTTP on 0.0.0.0 port 8000 ...
ブラウザでアクセス
作成したファイルが test.py
の場合、
http://localhost:8000/cgi-bin/test.py
にアクセスします。
リファレンス
- (Python3) 21.22. http.server — HTTP servers — Python 3.5.1 ドキュメント
- (Python2) 20.20. CGIHTTPServer — CGI-capable HTTP request handler — Python 2.7.11 documentation
- https://yxshipg.appspot.com/python/python3_cgi/
- http://ura22.sakura.ne.jp/pycgi/local.html
- 「#!/usr/bin/python」と「#!/usr/bin/env python」の違い - 座敷牢日誌