Python egg在交互模式下找到,但在fastcgi中未找到

1 投票
4 回答
524 浏览
提问于 2025-04-15 14:06

根据这个问题和它的回答,我添加了egg的路径,结果成功了。不过,当我在Python交互模式下导入flup时,没遇到任何问题,也不需要额外指定路径。这之间有什么不同呢?

编辑:看起来在处理fastcgi的过程中,.pth文件没有被解析,但这只是我的猜测。需要更多官方的说明。

4 个回答

0

在网络服务器上运行的程序或代码,和你平时直接操作时的环境相比,是有限制的。这个差别主要是因为你平时使用的环境和FastCGI环境之间的不同。不过,我不能告诉你在这个情况下,哪个差别是最重要的。

0

我在用IIS(Windows)运行Python应用时遇到过类似的问题。我发现,当在ISAPI下运行时,蛋(这里指的是Python的包)是无法读取的,因为setuptools会搞乱压缩蛋的权限,而且ISAPI应用是以一个权限有限的账户运行的。

你可能在使用FastCGI时也遇到同样的情况。如果FastCGI进程没有权限去读取这些蛋或者解压这些蛋,你可能会遇到问题。此外,我还发现将PYTHON_EGG_CACHE这个环境变量设置为一个进程可以写入的目录,对某些蛋来说也是必要的(特别是那些包含二进制/扩展模块或必须作为文件访问的资源的蛋)。

2

经过更深入的分析,我觉得我明白这里发生了什么。

当Python启动时,它会设置一个叫做sys.path的东西(这是初始化解释器的一部分)。

这个时候,环境变量会被用来确定在哪里找到.pth文件。如果此时没有定义PYTHONPATH,那么它就找不到安装在sys.prefix里的模块。此外,由于easy-install.pth可能安装在你自定义的前缀目录里,它也不会找到那个.pth文件来解析。

在解释器初始化后,如果你再往os.environ或sys.path里添加环境变量,也不会重新解析.pth文件。这就是为什么你发现自己不得不手动做一些Python本该自动完成的事情。

我认为正确的解决方案是确保在Python解释器启动时(也就是mysite.fcgi执行之前),自定义路径是可用的。

我查找了在mod_fastcgi中添加PYTHONPATH环境变量的选项,但没有找到这样的选项。也许这是一个通用的Apache选项,所以在mod_fastcgi中没有文档说明,或者在mod_fastcgi配置中设置静态变量是不可能的。

考虑到这一点,我认为你可以通过以下方式找到一个解决方法:

  1. 创建一个包装脚本(可以是一个shell脚本或另一个Python脚本),这个脚本将成为你新的FastCGI处理程序。
  2. 在这个包装脚本中,将PYTHONPATH环境变量设置为你的前缀路径(就像你在用户环境中设置的那样,这样是有效的)。
  3. 让这个包装脚本启动原始的fastcgi处理程序(mysite.fcgi),并使用修改过的环境。

虽然我没有一个好的环境来测试,但我觉得一个包装shell脚本可能看起来像这样:

#!/bin/sh
export PYTHONPATH=/your/local/python/path
/path/to/python /path/to/your/fastcgi/handler  # this line should be similar to what was supplied to mod_fastcgi originally

也许还有其他替代的解决方法可以考虑。

  • 从mysite.fcgi中,让Python根据新的、修改过的环境重新处理sys.path。我不知道该怎么做,但这可能比有一个包装脚本更简洁。
  • 找到一个Apache/mod_fastcgi的选项,允许为fastcgi进程指定一个环境变量(PYTHONPATH)。

撰写回答