我有一个小型web.py
Python 应用程序,我想在 Apache 下使用mod_python
. 该web.py
框架以及相关应用程序所依赖的其他第三方 Python 模块都安装在虚拟环境中。虚拟环境在里面创建: /home/ayaz/Sandbox/Scrapper/
我用于设置此应用程序的 Apache 虚拟主机配置的相关片段如下:
<Location "/api">
PythonPath "['/home/ayaz/Sandbox/Scrapper/lib/python2.5/site-packages/', '/home/ayaz/project/'] + sys.path"
#PythonHandler wsgiref.modpython_gateway::handler
PythonHandler modpython_gateway::handler
SetHandler python-program
PythonOption wsgi.application device_api::main
PythonOption device_api /api/
</Location>
但是,在浏览器上,当我尝试访问/api
URL 时,我500
从服务器收到一个错误,日志中显示无法找到web
从文件(这是我的应用程序)中导入的模块;device_api.py
换句话说,我看到一个ImportError
. 我不确定为什么它无法找到该web
模块。
从 Python 解释器能够从该指令中定义的路径中找到文件这一事实判断,我知道该PythonPath
指令至少部分有效。device_api.py
但是,它无法找到在同一指令中也定义了路径的其余模块。
对此的任何帮助将不胜感激。
谢谢!
更新#1
Ned 的回复让我在
site-packages
目录中查找我拥有的虚拟环境。虽然对我来说目录内的权限看起来不错,但我意识到mod_python/Apache
无法读取eggs
. 由于我在虚拟环境中安装了所有的包easy_install
,所以它们都是鸡蛋的形式。因此,例如,如果我将目录/home/ayaz/Sandbox/Scrapper/lib/python2.5/site-packages/web.py-0.34-py2.5.egg/web/
移入/home/ayaz/Sandbox/Scrapper/lib/python2.5/site-packages/
(基本上将其从 egg 文件/目录中取出),则mod_python
不再抱怨缺少web
模块(当然,它随后开始抱怨缺少其他第三方模块)。我已将 Apache 配置为以我的用户和组身份运行,也就是说
ayaz
,我检查了/home/ayaz/.python-eggs
目录上的权限是否正常。然后我在 Django 部署文档页面上使用了这个Using egg with mod_python被欺骗了。但这没有帮助。
mod_python
最终,我咬紧牙关,对于每个抱怨找不到 的第三方模块 ,我将实际目录从 egg 内部的那个模块移到了 egg 之外,并移到site-packages
了虚拟环境的目录中。这使得mod_python
找到模块。现在,我真的不确定为什么会发生这种情况,以及为什么
mod_python
无法读取鸡蛋。