mod_python 在虚拟环境中无法找到 web.py 模块

2 投票
2 回答
762 浏览
提问于 2025-04-16 08:13

我有一个小的 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 个回答

1

这可能是文件或文件夹权限的问题吗?请检查一下你在 virtualenvsite-packages 里的所有文件和文件夹,确保这些文件和文件夹对运行 Apachemod_python 的用户是可以访问的。

1

为了回答这个问题,我决定把我提问时更新的段落复制过来,作为答案发布,因为这些内容在某种程度上解释了我如何解决这个问题。

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无法读取这些“蛋”。

撰写回答