Apache + Djangoで、pyenvからのPythonでなく、システム上のPython2.7を使用してしまっているのですが。


centOS7上にて、
$ sudo yum install httpd mod_wsgi
$ pyenv install 3.5.1
$ pyenv rehash
$ pyenv global 3.5.1
としてPython3.5.1にしたつもりなんですが、Apache + Djangoでエラー時に、以下のようにPythonが2.7のままです。


Request Method: GET
Request URL: http://localhost/myapp
Django Version: 1.9.1
Exception Type: SyntaxError
Exception Value:

invalid syntax (forms.py, line 31)

Exception Location: /home/foo/workspace/myproject/myapp/views.py in myapp, line 23
Python Executable: /usr/bin/python
Python Version: 2.7.5
Python Path:

['/home/foo/workspace/myproject',
'/home/foo/.pyenv/versions/3.5.1/lib/python3.5/site-packages',
'/usr/lib/python2.7/site-packages/pip-7.1.2-py2.7.egg',
'/usr/lib64/python27.zip',
'/usr/lib64/python2.7',
'/usr/lib64/python2.7/plat-linux2',
'/usr/lib64/python2.7/lib-tk',
'/usr/lib64/python2.7/lib-old',
'/usr/lib64/python2.7/lib-dynload',
'/usr/lib64/python2.7/site-packages',
'/usr/lib64/python2.7/site-packages/gtk-2.0',
'/usr/lib/python2.7/site-packages']

SERVER_SOFTWARE : 'Apache/2.4.6 (CentOS) mod_wsgi/3.4 Python/2.7.5'


これを、Python3.5.1に変えるにはどのようにすれば良いのでしょうか?
よろしくお願いします。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2016/02/10 18:15:04

回答3件)

id:a-kuma3 No.1

回答回数4973ベストアンサー獲得回数2154

そのコマンドプロンプトで、python -v して 3.5.1 が返ってくるなら、原因はこれかしら。

Daemon Mode

wsgi_modはデフォルトで「Embedded Mode」になっている。
「Embedded Mode」はApacheを再起動しないとpythonファイルが更新されない。
pythonの修正を即時に反映させるためには、「Daemon Mode」に設定する。

ApacheでPython3+Django ~Mac~ - Qiita

もし、コマンドプロンプトで 3.5.1 が返ってこないなら、PATH で .pyenv よりも /usr/local/bin の方が先になってるからとか。

他2件のコメントを見る
id:a-kuma3
#! python
import os
print os.environ

とか、

#! python
import os
print os.environ["PATH"]

というような感じで、Apache の CGI として動作している環境の PATH を確認してみては、どうでしょう。

$ su && python -V

ちなみに、これは root の環境で選択される python を表しません。
&& の両側は、それぞれ、現在のシェルで実行されます。
root の環境を知りたければ、こうです。

$ su - root -c "python -V"

Apache は nobody 権限で動くので、一旦 root 環境に落ちてから実行するか、

$ su
password:
# su - nobody -c "python -V"

一発でやるなら、su を二重に呼びます。

$ su root -c "su - nobody -c 'python -V'"

nobody のパスワードが分かっていれば、これで OK です。

$ su - nobody -c "python -V"
2016/02/03 21:18:28
id:valilian

ご回答ありがとうございました。

su - nobody -c "python -V"

はThis account is currently not available.と出てきたので代わりにhttpd.confにて、
User foo
Group foo
に変更して実行してみました。(これでいいのかは分かりませんが)
しかし、やはり2.7.5の方を取りにいっているようです。

mod_wsgiをyumにて取得しているため、mod_wsgiがデフォルトのPythonに依存していてこうなってるのかなと思ったりしました。

2016/02/04 17:48:59
id:studiocherry No.2

回答回数283ベストアンサー獲得回数100

基本的に apache 起動時の path が、参照される思うのですが、root ユーザ や apacheユーザで
which python
とか
python -v
してみるとどうなるでしょうか?



今回の本質的な解決方法としては、mod_wsgi の設定を httpd.conf で、WSGIPythonHome の設定するのが良いでしょう。

/home/foo/.pyenv/versions/3.5.1/bin/python であれば、

<IfModule mod_wsgi.c>
WSGIPythonHome /home/foo/.pyenv/versions/3.5.1/
</IfModule>

のように Pythonのホームも定義することで、指定された python が使われます。

id:valilian

ご回答まことにありがとうございます。

$ su
$ which python
/home/foo/.pyenv/shims/python
$ python -v
3.5.1
となっております。

ご指摘のように、WSGIPythonHomeを色々な設定方法で試してみたのですが、ブラウザがエラーを返してきてしまいました。
mod_wsgiをソースからでなく、yumから入れているので、pyenvから取得したPythonとは上手くいかないのかなと思い始めてきました。

2016/02/04 17:51:49
id:TransFreeBSD No.3

回答回数668ベストアンサー獲得回数268

mod_wsgiはビルド時に使用するpythonバイナリを指定します。
WSGIPythonHomeなどは使用するライブラリなどを指定するためにあります。
参考: https://code.google.com/archive/p/modwsgi/wikis/QuickInstallationGuide.wiki

理由としてはshared libraryを使用するからっぽいですね。
こっちも参考に: http://qiita.com/methane/items/bf0b74550bee125cdea4

yumに3.5用のmod_wsgiがなければ自家ビルドするしかないと思います。

id:a-kuma3

shared library を使ってるからこそ、特定のバージョンのみに依存しないということになるのだと思いますが、mod_wsgi Wiki に以下の記述があるということは、Python 2.x と 3.x の間では(その共有ライブラリに)何か非互換があるということなんでしょうね。

And Python 2.X version from Python 2.3 onwards can be used. Python 3.0 and later will only be able be used with mod_wsgi 3.0 when released.

https://code.google.com/archive/p/modwsgi/wikis/QuickInstallationGuide.wiki
2016/02/09 23:10:26
id:TransFreeBSD

遅まきですが、
手元の環境だとshared library下記のようになってます。

/usr/local/lib/libpython2.7.so
/usr/local/lib/libpython3.4m.so

マイナーバージョン(2.7の7や3.4の4)が入ってるんですよね。
ライブラリの.soより前にバージョン番号入ってるのは、多くはABIに互換ない(可能性がある)からなんですが、pythonのが実際に故かは分かりませんが、現実としてライブラリにマイナーバージョンが含まれてるので、通常別のを使うことは出来ませんね。
#ファイルを置き換えるとか、システムでフックして入れ替える機構がある事もありますが、それで動くかはわかりません

参考:
http://docs.python.jp/2.7/extending/embedding.html#compiling-and-linking-under-unix-like-systems

2016/02/13 13:46:30
  • id:a-kuma3
    質問が閉まっちゃってるので、こちらでコメント返します。

    TransFreeBSD>遅まきですが、
    TransFreeBSD>手元の環境だとshared library下記のようになってます。

    ライブラリ XXX をコンパイル&リンクするときは、

    $ cc ... -lXXX

    で、libXXX.so は、libXXX.so.9.99 へのシンボリックリンクになっている。
    というのが、一般的だと思ってたんですが、違うのかな...

    # もちろん、インターフェースに互換があるというのが前提ではありますけど。
  • id:TransFreeBSD
    一般的にはその通りで、libpython2.7.soもlibpython2.7.so.1へのシンボリックリンクです。
    しかし多くはlibpython.soとかバージョン番号のはいらないシンボリックリンクも持つことが多いですけど、pythonはないんですよね。
    configureでpythonバイナリ求めてるのは、
    https://github.com/GrahamDumpleton/mod_wsgi/blob/develop/configure#L2851
    https://github.com/GrahamDumpleton/mod_wsgi/blob/develop/configure#L2904
    このへんでバージョン番号を得てライブラリ名などコンパイルやリンクに必要なオプション(-lpython2.7とか)を得るためのようです。
    pythonは別バージョンリンクしたかったらコンパイルしなおさなくてはならないのが仕様のようです。
  • id:a-kuma3
    ということは、今回のケースでは mod_wsgi のソースを持ってきて、configure + make してみたら、ってことになるんですかね。
    本家で mod_wsgi 3.0 を出してないってことは、何か問題があるのかも、ということも合わせて。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません