Python egg在交互模式下找到,但在fastcgi中未找到
根据这个问题和它的回答,我添加了egg的路径,结果成功了。不过,当我在Python交互模式下导入flup时,没遇到任何问题,也不需要额外指定路径。这之间有什么不同呢?
编辑:看起来在处理fastcgi的过程中,.pth文件没有被解析,但这只是我的猜测。需要更多官方的说明。
4 个回答
在网络服务器上运行的程序或代码,和你平时直接操作时的环境相比,是有限制的。这个差别主要是因为你平时使用的环境和FastCGI环境之间的不同。不过,我不能告诉你在这个情况下,哪个差别是最重要的。
我在用IIS(Windows)运行Python应用时遇到过类似的问题。我发现,当在ISAPI下运行时,蛋(这里指的是Python的包)是无法读取的,因为setuptools会搞乱压缩蛋的权限,而且ISAPI应用是以一个权限有限的账户运行的。
你可能在使用FastCGI时也遇到同样的情况。如果FastCGI进程没有权限去读取这些蛋或者解压这些蛋,你可能会遇到问题。此外,我还发现将PYTHON_EGG_CACHE这个环境变量设置为一个进程可以写入的目录,对某些蛋来说也是必要的(特别是那些包含二进制/扩展模块或必须作为文件访问的资源的蛋)。
经过更深入的分析,我觉得我明白这里发生了什么。
当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配置中设置静态变量是不可能的。
考虑到这一点,我认为你可以通过以下方式找到一个解决方法:
- 创建一个包装脚本(可以是一个shell脚本或另一个Python脚本),这个脚本将成为你新的FastCGI处理程序。
- 在这个包装脚本中,将PYTHONPATH环境变量设置为你的前缀路径(就像你在用户环境中设置的那样,这样是有效的)。
- 让这个包装脚本启动原始的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)。