当使用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
,表明这是因为'活塞'被指定为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错误,因为“没有名为piston.handler的模块”。
我已经排除了python路径问题; site-packages目录位于所有尝试的路径中。我不知道为什么它会像这样,任何想法?
答案 0 :(得分:2)
在看了一些之后,我在the docs for 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 egg相关的任何特殊目录自动添加到'sys.path'所必需的。
将site.addsitedir
调用添加到我的wsgi脚本(代替附加到sys.path
,就像我一直在做的那样)清除了所有问题。