4

Apache mod-wsgi でデプロイしたい django webapp に問題があり、この行までたどりました (django-tagging モジュールがありません):

[2013 年 2 月 20 日水曜日 13:08:42] [エラー] [クライアント 172.19.130.50] ImportError: タグ付けという名前のモジュールがありません

ここで、root および apache ユーザーとして pip-python (CENTOS 6 を使用しています) を実行しようとしたときの出力を次に示します。

[root@app1 サイト-パッケージ]# pip-python フリーズ | grep タグ
ジャンゴのタグ付け== 0.3.1
ジャンゴ-taggit==0.9.3

タグ付けがインストールされています...

[root@app1 サイト-パッケージ]# sudo -u apache pip-python フリーズ | grep タグ
ジャンゴのタグ付け== 0.3.1
ジャンゴ-taggit==0.9.3

Apache ユーザーも同じことを言っています。

[root@app1 /]# パイソン
Python 2.6.6 (r266:84292、2012 年 9 月 11 日、08:34:23)
[GCC 4.4.6 20120305 (Red Hat 4.4.6-4)] linux2 上
詳細については、「ヘルプ」、「著作権」、「クレジット」、または「ライセンス」と入力してください。
>>> タグ付けをインポート
>>>

OK root はタグ付けをインポートできます!

[root@app1 /]# sudo -u apache python
Python 2.6.6 (r266:84292、2012 年 9 月 11 日、08:34:23)
[GCC 4.4.6 20120305 (Red Hat 4.4.6-4)] linux2 上
詳細については、「ヘルプ」、「著作権」、「クレジット」、または「ライセンス」と入力してください。
>>> タグ付けをインポート
トレースバック (最新の呼び出しが最後):
  ファイル ""、1 行目、
ImportError: tagging という名前のモジュールがありません
>>>

しかし、apache ユーザーはできません!!!!! どうすればこれを機能させることができますか????

django タグ付けのために /usr/lib/python2.6/site-packages/ に対するすべての権利を二重および三重にチェックしましたが、それらは他のパッケージと同じです。

更新 1: django-tagging モジュールをどのようにインストールしたかはよく覚えていませんが、apache はモジュールをグローバルにインストールできないため、おそらく root としてインストールしました!

更新 2: martijn-pieters の提案の出力は次のとおりです。

[root@app1 /]# sudo -u apache python -c 'import sys; print sys.path'
[''、'/usr/lib64/python2.6/site-packages/Twisted-12.1.0-py2.6-linux-x86_64.egg'、'/usr/lib/python2.6/site-packages/django_cas -2.1.1-py2.6.egg', '/usr/lib64/python26.zip', '/usr/lib64/python2.6', '/usr/lib64/python2.6/plat-linux2', ' /usr/lib64/python2.6/lib-tk', '/usr/lib64/python2.6/lib-old', '/usr/lib64/python2.6/lib-dynload', '/usr/lib64/ python2.6/site-packages'、'/usr/lib/python2.6/site-packages'、'/usr/lib/python2.6/site-packages/setuptools-0.6c11-py2.6.egg-info ']
[root@app1 /]# python -c 'import sys; print sys.path'
[''、'/usr/lib64/python2.6/site-packages/Twisted-12.1.0-py2.6-linux-x86_64.egg'、'/usr/lib/python2.6/site-packages/django_cas -2.1.1-py2.6.egg', '/usr/lib64/python26.zip', '/usr/lib64/python2.6', '/usr/lib64/python2.6/plat-linux2', ' /usr/lib64/python2.6/lib-tk', '/usr/lib64/python2.6/lib-old', '/usr/lib64/python2.6/lib-dynload', '/usr/lib64/ python2.6/site-packages'、'/usr/lib/python2.6/site-packages'、'/usr/lib/python2.6/site-packages/setuptools-0.6c11-py2.6.egg-info ']
[root@app1 /]# sudo -u apache head `which pip-python`
#!/usr/bin/python
# EASY-INSTALL-ENTRY-SCRIPT: 'pip==0.8','console_scripts','pip'
__必要__ = 'pip==0.8'
システムをインポート
from pkg_resources import load_entry_point

__name__ == '__main__' の場合:
    sys.exit(
        load_entry_point('pip==0.8', 'console_scripts', 'pip')()
    )
[root@app1 /]# head `which pip-python`
#!/usr/bin/python
# EASY-INSTALL-ENTRY-SCRIPT: 'pip==0.8','console_scripts','pip'
__必要__ = 'pip==0.8'
システムをインポート
from pkg_resources import load_entry_point

__name__ == '__main__' の場合:
    sys.exit(
        load_entry_point('pip==0.8', 'console_scripts', 'pip')()
    )

まったく同じです:(

更新 3: はい、Apache ユーザーは他のモジュールをロードできます。

[root@app1 /]# sudo -u apache python
Python 2.6.6 (r266:84292、2012 年 9 月 11 日、08:34:23)
[GCC 4.4.6 20120305 (Red Hat 4.4.6-4)] linux2 上
詳細については、「ヘルプ」、「著作権」、「クレジット」、または「ライセンス」と入力してください。
>>> ジャンゴをインポート
>>> ツイストをインポート
>>> カイロを輸入

更新 4:私は自分が嫌いです。問題は /usr/lib/python2.6/site-packages/tagging/ ディレクトリのアクセス権でした! それらは正しい drwxr-xr-x(755) ではなく drw-r--r-- (644) だったので、Apache ユーザーはディレクトリ内に入ることができませんでした :(

すべてがうまくいきました。すべての助けに感謝します!

4

1 に答える 1

2

私はこの動作に似た何かを経験し、インポートするモジュールの正確なパスを Django wsgi.py ファイルに追加することになりました:

import sys
PACKAGES ='/usr/local/lib/python2.6/dist-packages/'
sys.path.append(PACKAGES + 'django_compressor-1.1.1-py2.6.egg')

それが役に立てば幸い。

誰が悪いのか?よくわかりませんが、apache か mod_wsgi かもしれません。これは、Ubuntu 10.04 の apache2 で発生しました。Debian 安定版からの apache2 での最近のセットアップとテストでは、sys.path.append が不要になりました。

于 2013-03-15T11:25:30.797 に答える