2

当使用 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_packagessetup.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 目录位于所有尝试的路径中。我不知道它会表现出这种行为的任何其他原因,有什么想法吗?

4

1 回答 1

2

在看了更多之后,我在mod_wsgi 的文档中找到了答案:

然而,作为附加步骤,将修改说明中描述的 WSGI 脚本文件,以将应用程序的虚拟环境覆盖在基线环境之上。这可以通过在 WSGI 脚本文件的最开始添加以下内容来完成:

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

请注意,在这种情况下,需要指定虚拟环境的“站点包”目录的完整路径,而不仅仅是虚拟环境的根目录。

使用 'site.addsitedir()' 与简单地将目录添加到 'sys.path' 有点不同,因为该函数将打开目录中的任何 '.pth' 文件并处理它们。这对于确保任何与 Python 鸡蛋相关的特殊目录都自动添加到“sys.path”中是必要的。

site.addsitedir调用添加到我的 wsgi 脚本(代替附加到sys.path,就像我一直在做的那样)清除了所有问题。

于 2010-11-13T01:13:18.957 回答