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は、すべての試行のパスにあります。私はそれがこのように振る舞う他の理由を知りません、何かアイデアはありますか?