質問: いつもお世話になっております。 CGI上でのpython実行について、ご教授いただきたいです。 現在、CGI形式でpythonを実行する環境を構築しているのですが、 CGI形式でwebブラウザからpythonを実行すると、 システムのデフォルトのpythonが使われてしまいます。 pyenvで指定したバージョンのpythonを使って欲しいのですが、 どうにもうまくいってくれません...。 以下に、サンプルや実行環境を示します。 CGI周りに詳しい方、どなたかご教授いただけないでしょうか...? ##### サンプル ``` #!/usr/bin/env python # -*- coding: utf-8 -*- #このファイルがwebブラウザから間接的に実行されます。 #以下、処理が続きます... ``` ##### 環境 * OS:MAC OSX elcapitan * システムデフォルトのpython: Python/2.7.10 * pyenvで指定したpython: Python 3.5.0 :: Anaconda 2.4.0 * 使っているWebサーバ: Apache/2.2.29(MAMPでインストールしたもの) ##### 原因と対策 * 原因ですが、1行目のシバン行に問題があるかと考えています。 * /usr/bin/envを使った場合、環境変数PATHに指定されたフォルダを順に探しにいくかと思います。CGI形式で実行した場合、そもそも環境変数PATHにpython周りのパスが通っていないため、システムデフォルトのver2.7のpythonが使われてしまいます。 * おそらく、1行目のシバン行でpythonを呼び出す前に、環境変数PATHに仕込めればうまくいきそうかなと考えています(こういったことは可能でしょうか...?)。 ##### 代案 * また、以下のように、シバン行にpyenvで使っているpythonのPATHを直接書き込む方法も試してみました。 ``` #!/Users/UserName/.pyenv/shims/python # -*- coding: utf-8 -*- #以下、処理が続きます... ``` * この場合、以下のようなエラーが出てしまい、うまくいきませんでした。 * (色々調べては見たのですが、エラーメッセージがこれだけしかでないので、結局よくわからず...) * (シバン行を`#!/usr/bin/env python`とすればエラーにならないので、pythonファイル自体の文字コードやパーミッションに問題はなさそうです。) ``` [Sun Aug 28 17:09:07 2016] [error] [client ::1] (8)Exec format error: exec of '/Applications/MAMP/htdocs/jupyter-to-td/lib/issue_kpi_query_from_web.py' failed, referer: http://localhost:8888/jupyter-to-td/view/ajax_example.html [Sun Aug 28 17:09:07 2016] [error] [client ::1] Premature end of script headers: issue_kpi_query_from_web.py, referer: http://localhost:8888/jupyter-to-td/view/ajax_example.html ``` ##### その他相談したい事 * Ajaxを使ってweb上から非同期でpythonスクリプトを実行したいため、今回CGI周りの設定を行っています。 * 恥ずかしながら、今回の設定で初めて、CGIやモジュール形式などを知りました。 * CGI形式について調べてみたところ、色々と気を使わなければならない事が多く、結構厄介な印象を受けました。 * そもそも、モジュール形式(apacheならmod_pythonを使う方法)にした方が良いでしょうか? * (モジュール形式の方がつまづくポイントは少なそうなものの、apacheにモジュールの追加と再ビルドが必要なので、難しそうかなという印象を受けています(笑))
回答: 以下、OS X El Capitanで動作確認しています。 これが正しい作法なのかどうか私も分からないのですが、 少なくとも、CGI自体はシバンを `#!/Users/UserName/.pyenv/shims/python` や `#!/Users/UserName/.pyenv/versions/3.5.2/bin/python` のようにすればそのバージョンで実行することができました。 以下のスクリプトを、デフォルトのApacheのCGIディレクトリーに`py.cgi`のようなファイル名で保存して実行したところ、シバンで指定したバージョンで実行されていることが確認できました。 ``` #!(シバン) print("Content-Type: text/plain") print() import sys print(sys.version) ``` このスクリプトを試していただけませんか? これが動作しないとしたら、環境や設定の問題だと思います。 これが動作するなら、スクリプトの中で何をしているかによるので原因は今のところ不明です。 とりあえず、そのエラーメッセージだけでは分からないので、問題の切り分けをしてみて下さい。 あまり意味ないかも知れませんが、 `#!/usr/bin/env /Users/UserName/.pyenv/versions/3.5.2/bin/python` としたらどうなるでしょうか?