質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
SharePoint

SharePointは、マイクロソフトにより開発された、ソフトウェア開発のドキュメント管理やコラボレーションを行うプラットフォームの総称です

Apache

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

Q&A

解決済

1回答

7773閲覧

CGI形式でpythonを実行する際、pyenvで指定したバージョンのpythonが実行されるようにしたいです

th1209

総合スコア40

SharePoint

SharePointは、マイクロソフトにより開発された、ソフトウェア開発のドキュメント管理やコラボレーションを行うプラットフォームの総称です

Apache

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

0グッド

0クリップ

投稿2016/08/28 08:53

いつもお世話になっております。
CGI上でのpython実行について、ご教授いただきたいです。

現在、CGI形式でpythonを実行する環境を構築しているのですが、
CGI形式でwebブラウザからpythonを実行すると、
システムのデフォルトのpythonが使われてしまいます。

pyenvで指定したバージョンのpythonを使って欲しいのですが、
どうにもうまくいってくれません...。

以下に、サンプルや実行環境を示します。
CGI周りに詳しい方、どなたかご教授いただけないでしょうか...?

サンプル

python

1#!/usr/bin/env python 2# -*- coding: utf-8 -*- 3 4#このファイルがwebブラウザから間接的に実行されます。 5#以下、処理が続きます...
環境
  • 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を直接書き込む方法も試してみました。

python

1#!/Users/UserName/.pyenv/shims/python 2# -*- coding: utf-8 -*- 3 4#以下、処理が続きます...
  • この場合、以下のようなエラーが出てしまい、うまくいきませんでした。
  • (色々調べては見たのですが、エラーメッセージがこれだけしかでないので、結局よくわからず...)
  • (シバン行を#!/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にモジュールの追加と再ビルドが必要なので、難しそうかなという印象を受けています(笑))

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

以下、OS X El Capitanで動作確認しています。

これが正しい作法なのかどうか私も分からないのですが、
少なくとも、CGI自体はシバンを
#!/Users/UserName/.pyenv/shims/python

#!/Users/UserName/.pyenv/versions/3.5.2/bin/python
のようにすればそのバージョンで実行することができました。

以下のスクリプトを、デフォルトのApacheのCGIディレクトリーにpy.cgiのようなファイル名で保存して実行したところ、シバンで指定したバージョンで実行されていることが確認できました。

lang

1#!(シバン) 2 3print("Content-Type: text/plain") 4print() 5 6import sys 7print(sys.version)

このスクリプトを試していただけませんか?
これが動作しないとしたら、環境や設定の問題だと思います。
これが動作するなら、スクリプトの中で何をしているかによるので原因は今のところ不明です。
とりあえず、そのエラーメッセージだけでは分からないので、問題の切り分けをしてみて下さい。

あまり意味ないかも知れませんが、
#!/usr/bin/env /Users/UserName/.pyenv/versions/3.5.2/bin/python
としたらどうなるでしょうか?

投稿2016/08/28 14:39

argius

総合スコア9390

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

th1209

2016/08/29 01:24

argiusさん いつも教えていただきありがとうございます...。 なるほど、シバン行に`#!/Users/UserName/.pyenv/versions/3.5.2/bin/python`と、 直接pythonのパスを指定する方法ですね...。 こちらの方法を試して見たところ、 上手く実行することができました! 解決できましたので、 こちらの方法で開発を進めてみようかなと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問