人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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に変えるにはどのようにすれば良いのでしょうか?
よろしくお願いします。

●質問者: valilian
●カテゴリ:コンピュータ ウェブ制作
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● a-kuma3

そのコマンドプロンプトで、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 の方が先になってるからとか。


valilianさんのコメント
a-kuma3さん、いつも本当にありがとございます。 Apacheもですが、コンピュータ自体も再起動したのですが、やはりエラー時に2.7.5と表示されています。 $ python -V 3.5.1 $ su && python -V 3.5.1 でpythonは3.5.1を呼び出しているとは思うのですが $ python manage.py runserver で呼び出し、あえてエラーを出すとPythonのバージョンは3.5.1になっています おそらくApacheとmod_wsgiのところが何か問題があるような気がします 以下はrunserverで同じスクリプトを実行した時のエラー内容です Python Executable:/home/foo/.pyenv/versions/3.5.1/bin/python Python Version:3.5.1 Python Path:['/home/foo/workspace/myproject', '/home/foo/.pyenv/versions/3.5.1/lib/python35.zip', '/home/foo/.pyenv/versions/3.5.1/lib/python3.5', '/home/foo/.pyenv/versions/3.5.1/lib/python3.5/plat-linux', '/home/foo/.pyenv/versions/3.5.1/lib/python3.5/lib-dynload', '/home/foo/.pyenv/versions/3.5.1/lib/python3.5/site-packages']

valilianさんのコメント
ちなみにApacheのconfファイルですが、 WSGIPythonPath /home/foo/workspace/myproject:/home/foo/.pyenv/versions/3.5.1/lib/python3.5/site-packages としていて問題はないのかなとも思いますが 何故かcentOS7デフォルトのpython2.7.5を参考しに行っています

a-kuma3さんのコメント
>|| #! python import os print os.environ ||< とか、 >|| #! python import os print os.environ["PATH"] ||< というような感じで、Apache の CGI として動作している環境の PATH を確認してみては、どうでしょう。 >|| $ su && python -V ||< ちなみに、これは root の環境で選択される python を表しません。 &amp;&amp; の両側は、それぞれ、現在のシェルで実行されます。 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" ||<

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に依存していてこうなってるのかなと思ったりしました。

2 ● studiocherry

基本的に 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 が使われます。


valilianさんのコメント
ご回答まことにありがとうございます。 $ su $ which python /home/foo/.pyenv/shims/python $ python -v 3.5.1 となっております。 ご指摘のように、WSGIPythonHomeを色々な設定方法で試してみたのですが、ブラウザがエラーを返してきてしまいました。 mod_wsgiをソースからでなく、yumから入れているので、pyenvから取得したPythonとは上手くいかないのかなと思い始めてきました。

3 ● TransFreeBSD

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がなければ自家ビルドするしかないと思います。


a-kuma3さんのコメント
shared library を使ってるからこそ、特定のバージョンのみに依存しないということになるのだと思いますが、mod_wsgi Wiki に以下の記述があるということは、Python 2.x と 3.x の間では(その共有ライブラリに)何か非互換があるということなんでしょうね。 >https://code.google.com/archive/p/modwsgi/wikis/QuickInstallationGuide.wiki> 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 <span style="color:red;">mod_wsgi 3.0 <u>when released</u></span>. <<

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
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ