【发布时间】:2010-11-13 00:57:11
【问题描述】:
当使用 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
Pip 不会安装活塞的__init__.py,说明这是因为'piston' 被指定为setup.py 中的namespace_packages 之一。
此外,当我查看“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 目录位于所有尝试的路径中。我不知道它会出现这种行为的任何其他原因,有什么想法吗?
【问题讨论】:
标签: python django apache mod-wsgi django-piston