当使用 pip 从 bitbucket repo 安装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
Pip 不会安装活塞的__init__.py
,这表明这是因为 'piston' 被指定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 shell 导入活塞 [虽然它的 repr 是<module 'piston' (built-in)>
],并且从 runserver 看起来一切正常。),但是我的项目在 apache mod_wsgi 上运行,抛出 500 错误在每一页上,因为有“没有名为活塞.handler 的模块”。
我已经排除了 python 路径问题;site-packages 目录位于所有尝试的路径中。我不知道它会表现出这种行为的任何其他原因,有什么想法吗?