web-dev-qa-db-ja.com

mod_wsgi:ImportError: 'encodings'という名前のモジュールはありません

CentOS 6.5でApache 2.2.15を使用しています。 Djangoアプリをセットアップしようとしています。仮想環境を使用していて、mod_wsgiは--with-python=/path/to/virtualenv/bin/python3.4で設定されています。

これをhttpd.confに追加しました:

WSGIPythonPath /srv/myproject:/path/to/virtualenv/lib/python3.4/site-packages
WSGIPythonHome /path/to/virtualenv
<VirtualHost *:80>
WSGIScriptAlias / /srv/myproject/myproject/wsgi.py
...
</VirtualHost>

wsgi.pyに追加しました

sys.path.insert(1, "/path/to/virtualenv/lib/python3.4/site-packages")

問題は、ブラウザーでアプリを開こうとすると、アプリが無期限に読み込まれることです。 Apacheのエラーログは次のとおりです。

Fatal Python error: Py_Initialize: Unable to get the locale encoding
ImportError: No module named 'encodings'
[Mon Jun 30 17:37:28 2014] [notice] child pid 19370 exit signal Aborted (6)
[Mon Jun 30 17:37:28 2014] [notice] child pid 19371 exit signal Aborted (6)
...
[Mon Jun 30 17:37:28 2014] [notice] child pid 19377 exit signal Aborted (6)
Fatal Python error: Py_Initialize: Unable to get the locale encoding
ImportError: No module named 'encodings'

興味深いのは、Python(2.6)のシステムインストールと仮想環境バージョン(3.4)の両方で、import encodingsが正常に機能することです!私は次のサンプルWSGIスクリプトを使用してみました mod_wsgi CheckingYourInstallationページ PythonのどのバージョンがApacheで使用されているかを確認しますが、同じImportErrorが発生します。

誰かが次のステップの提案をしていますか?私はドキュメントを精査しましたが、ここからどこへ行くべきかわかりません。

17
tao_oat

私の友人(IE:SysAdmins)の助けを借りて、昨夜これを理解しました。私は例で最もよく学ぶので、あなたがmod_wsgiを使ってApacheをLinuxグループApache、ユーザーフリッパーパを使って実行しているとしましょう。 my_project/wsgi.pyのwsgi.pyで/ home/my_projectをホストしているとしましょう。

トップレベル(ls -l /):

drwxr-xr-x.  47 root root  4096 Jul  9 09:43 home

ホームディレクトリ(ls -l/home):

drwxrwsr-x   7 flipper        Apache 4096 Jul 29 10:22 my_project

これが鍵でした。小文字の「s」は、Apacheグループのsetgidビットが設定され、実行ビットが設定されていることを意味します。もちろん、最後の「x」は誰でも実行できることを意味します。

ツリーの下の権限を確認してください。これは私たちにとってトリックでした。

5
FlipperPA

この問題はSELinuxが原因で発生しました。私がしたことはこれでした:

  • プロジェクトファイルを/ home/admin/myprojectに移動しました
  • flipperPAの答えのように権限を変更しました
  • そして、決定的に私は、httpd_enable_homedirsを使用してsetsebool -P httpd_enable_homedirs on SELinuxブール値をonに設定すると思います。

CentOS wikiの SELinuxガイド は非常に役に立ちました。たとえば、デバッグするにはsetenforce Permissiveを実行して、SELinuxがルールを強制しないようにしながら、ログに書き込むことができます。その後、もう一度setenforce Enforcingを忘れないでください!

2
tao_oat

Windowsでは、PythonインストールのLibディレクトリをPYTHONPATHに直接置くことでこの問題を解決しました。同じシェルでPythonを直接実行する場合、これは必要ですが、エンコーディングパッケージを見つけるためにこれは必要ありません。

set PYTHONPATH=C:\WinPython-64bit-3.4.4.6Qt5\python-3.4.4.AMD64\Lib;%PYTHONPATH%
c:\Apache24\bin\httpd.exe

また、正しいmod_wsgiバージョンを使用してください。私は nofficial Binaries page からダウンロードし、Python(上記の例では64ビット3.4)に一致するように選択しました。 Apacheを起動する.batファイルを上記のように変更した後、私のウェブサイトはPythonで正しく動作します。

私のバージョンのPython WinPython は、インストールを解凍してC:ドライブに配置することでインストールされることに注意してください。したがって、通常のWindowsの方法でレジストリにインストールされないため、レジストリの相互作用に関する考慮事項が最小限に抑えられます。

1
Lars Ericson