pythonに付属しているwebサーバ機能がとても便利で、
#python3 -m http.server –cgi 8000
といったコマンド1行で簡易webサーバが立ち上がり、LCDがないマイコンでも動作確認に便利です。
しかし、windowsでは動いていたのに、linux環境に持って行った途端、CGIを走らせると
Traceback (most recent call last):
File “/usr/lib/python3.5/http/server.py”, line 1135, in run_cgi
os.execve(scriptfile, args, env)
PermissionError: [Errno 13] Permission denied: ‘/root/www/cgi-bin/test.py’
こんな感じでパーミッションエラーが出る。
当然、test.pyは755にしているし、1行目のシバン(pythonのパス)も合わせた。改行コードもLFにした。
この解決方法がpython公式ドキュメントでも(少なくともhttp.serverのページには)書いておらず、google検索では全く的外れな解決方法しか表示されないので記載しておく。(50ページほど見て、英語ページで一言だけ正解があった)
追記:cgiのページにて発見
https://docs.python.org/ja/3/library/cgi.html
上記以外の原因として、rootユーザでpythonサーバを実行していることが考えられる。
この場合、webサーバも正常に起動し、htmlも表示できるが、cgiだけが表示されない現象となる。解決策は
useradd -mと passwd で適当なユーザを作り、/homeのユーザディレクトリにサーバデータ類を全部ぶち込み、
chown -R ユーザ:ユーザ で所有者をroot以外にして、そのユーザでサーバを起動するとcgiも動く。
昨今のIoTブームでシングルボードコンピュータのlinuxはrootで走っていることも多いので参考にしてください。