2

pipを使用してbitbucketリポジトリからdjango-pistonをインストールすると、何か奇妙なことに気づきました(出力の最初のインデントされた行):

$ pip install hg+http://bitbucket.org/jespern/django-piston
Downloading/unpacking hg+http://bitbucket.org/jespern/django-piston
Cloning Mercurial repository http://bitbucket.org/jespern/django-piston to /tmp/pip-v1h8Sh-build
Running setup.py egg_info for package from hg+http://bitbucket.org/jespern/django-piston
Installing collected packages: django-piston
Running setup.py install for django-piston
    Skipping installation of [venv]/lib/python2.6/site-packages/piston/__init__.py (namespace package)
    Installing [venv]/lib/python2.6/site-packages/django_piston-0.2.3rc1-py2.6-nspkg.pth
Successfully installed django-piston
Cleaning up

ピップはピストンをインストールしません__init__.py。これは、「ピストン」がの1つとして指定されているnamespace_packagesためsetup.pyです。

さらに、「django_piston-0.2.3rc1-nspkg.pth」ファイルを調べたところ、これが「仮想パッケージ」の試みのように見えます。

# File: [virtualenv]/lib/python2.6/site-packages/django_piston-0.2.3rc1-py2.6-nspkg.pth
# Originally all on one line; broken apart here for readability.

import sys,new,os;
p = os.path.join(sys._getframe(1).f_locals['sitedir'], *('piston',));
ie = os.path.exists(os.path.join(p,'__init__.py'));
m = not ie and sys.modules.setdefault('piston',new.module('piston'));
mp = (m or []) and m.__dict__.setdefault('__path__',[]);
(p not in mp) and mp.append(p)

ここで何が行われているのかがわかります。基本的には、ピストンがあるべき場所に「偽のモジュール」を作成します。これは、基本的にピストンのすべてのサブモジュールを集約します。

これはコマンドライン作業では正常に機能するようです(ピストンをdjangoシェルからインポートできます[reprは<module 'piston' (built-in)>]、runserverからは正常に機能するようです)が、apachemod_wsgiで実行しているプロジェクトで500エラーがスローされます「piston.handlerという名前のモジュールがない」ため、すべてのページにあります。

私はPythonパスの問題を除外しました。site-packages dirは、すべての試行のパスにあります。私はそれがこのように振る舞う他の理由を知りません、何かアイデアはありますか?

4

1 に答える 1

2

もう少し調べた後、mod_wsgiのドキュメントで答えを見つけました:

ただし、追加の手順として、手順で説明されているWSGIスクリプトファイルを変更して、ベースライン環境の上にアプリケーションの仮想環境をオーバーレイします。これは、WSGIスクリプトファイルの最初に次を追加することで実行されます。

import site
site.addsitedir('/usr/local/pythonenv/PYLONS-1/lib/python2.5/site-packages')

この場合、仮想環境のルートだけでなく、仮想環境の「site-packages」ディレクトリへのフルパスを指定する必要があることに注意してください。

'site.addsitedir()'の使用は、ディレクトリを' sys.path'に追加するのとは少し異なります。これは、関数がディレクトリにある'.pth'ファイルを開いて処理するためです。これは、Pythonの卵に関連する特別なディレクトリが自動的に「sys.path」に追加されるようにするために必要です。

site.addsitedirwsgiスクリプトに呼び出しを追加すると(以前のようにに追加する代わりにsys.path)、すべての問題が解決しました。

于 2010-11-13T01:13:18.957 に答える