mod_python 在虚拟环境中无法找到 web.py 模块
我有一个小的 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
这个网址时,服务器返回了一个 500
错误,日志中显示我在 device_api.py
文件中导入的 web
模块找不到,也就是说,我看到了一个 ImportError
。我不明白为什么它找不到 web
模块。
我知道 PythonPath
指令至少部分有效,因为 Python 解释器能根据这个指令找到 device_api.py
文件。但它却找不到同样在这个指令中定义的其他模块。
对此任何帮助我都非常感激。
谢谢!
更新 #1
Ned 的回复让我去查看我虚拟环境中的
site-packages
目录。虽然我觉得这个目录里的权限看起来没问题,但我意识到mod_python/Apache
不能读取eggs
文件。因为我在虚拟环境中用easy_install
安装的所有包都是以 eggs 的形式存在的。所以,比如说,如果我把目录/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 部署文档中解释的使用 eggs 与 mod_python 的技巧,但这并没有帮助。最后,我决定采取行动,对于每一个
mod_python
抱怨找不到的第三方模块,我把那个模块的实际目录从 egg 中移到虚拟环境的site-packages
目录里。这样mod_python
就能找到这些模块了。现在,我真的不明白为什么会这样,以及为什么
mod_python
不能读取 eggs。
2 个回答
这可能是文件或文件夹权限的问题吗?请检查一下你在 virtualenv
的 site-packages
里的所有文件和文件夹,确保这些文件和文件夹对运行 Apache
和 mod_python
的用户是可以访问的。
为了回答这个问题,我决定把我提问时更新的段落复制过来,作为答案发布,因为这些内容在某种程度上解释了我如何解决这个问题。
Ned的回复让我去查看我虚拟环境中的site-packages目录。虽然我觉得这个目录里的权限看起来没问题,但我意识到mod_python/Apache无法读取这些“蛋”(egg)。因为我在虚拟环境中用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/
(也就是把它从“蛋”文件/目录中拿出来),mod_python就不再抱怨缺少web模块了(当然,它接着又开始抱怨缺少其他第三方模块)。我把Apache配置成以我的用户和组运行,也就是ayaz,我检查了一下
/home/ayaz/.python-eggs
目录的权限,发现也没问题。然后我使用了这个在Django部署文档中提到的关于使用“蛋”的技巧,但这并没有帮助。最终,我决定硬着头皮,对于每一个mod_python抱怨找不到的第三方模块,我都把那个模块的实际目录从“蛋”里面移到虚拟环境的site-packages目录外面。这样mod_python就能找到这些模块了。
现在,我真的不明白为什么会这样,为什么mod_python无法读取这些“蛋”。