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に変えるにはどのようにすれば良いのでしょうか?
よろしくお願いします。
そのコマンドプロンプトで、python -v して 3.5.1 が返ってくるなら、原因はこれかしら。
Daemon Mode
wsgi_modはデフォルトで「Embedded Mode」になっている。
ApacheでPython3+Django ~Mac~ - Qiita
「Embedded Mode」はApacheを再起動しないとpythonファイルが更新されない。
pythonの修正を即時に反映させるためには、「Daemon Mode」に設定する。
もし、コマンドプロンプトで 3.5.1 が返ってこないなら、PATH で .pyenv よりも /usr/local/bin の方が先になってるからとか。
基本的に 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 が使われます。
ご回答まことにありがとうございます。
$ su
$ which python
/home/foo/.pyenv/shims/python
$ python -v
3.5.1
となっております。
ご指摘のように、WSGIPythonHomeを色々な設定方法で試してみたのですが、ブラウザがエラーを返してきてしまいました。
mod_wsgiをソースからでなく、yumから入れているので、pyenvから取得したPythonとは上手くいかないのかなと思い始めてきました。
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がなければ自家ビルドするしかないと思います。
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
遅まきですが、
手元の環境だと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
とか、
というような感じで、Apache の CGI として動作している環境の PATH を確認してみては、どうでしょう。
ちなみに、これは root の環境で選択される python を表しません。
&& の両側は、それぞれ、現在のシェルで実行されます。
root の環境を知りたければ、こうです。
Apache は nobody 権限で動くので、一旦 root 環境に落ちてから実行するか、
一発でやるなら、su を二重に呼びます。
nobody のパスワードが分かっていれば、これで OK です。
2016/02/03 21:18:28ご回答ありがとうございました。
2016/02/04 17:48:59su - 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に依存していてこうなってるのかなと思ったりしました。