同意这个问题及其答案。我添加了鸡蛋的路径,它起作用了。但是,当我以交互方式运行 python 并导入 Flup 时,它可以正常工作,也没有任何额外的路径规范。区别在哪里?
编辑:似乎在做 fastcgi 的时候,.pth 文件没有被解析,但这只是一个猜测。需要更多官方声明。
经过一些更彻底的分析,我想我明白这里发生了什么。
当 Python 启动时,它会设置 sys.path(所有这些都是初始化解释器的一部分)。
此时,环境用于确定在哪里可以找到 .pth 文件。如果此时没有定义 PYTHONPATH,那么它将找不到安装到 sys.prefix 的模块。此外,由于 easy-install.pth 可能已安装到您的自定义前缀目录,它不会找到要解析的 .pth 文件。
在解释器初始化后将环境变量添加到 os.environ 或 sys.path 不会导致再次解析 .pth 文件。这就是为什么您发现自己被迫手动执行您期望 Python 自然执行的操作。
我认为正确的解决方案是确保在解释器启动时(在执行 mysite.fcgi 之前)自定义路径对 Python 解释器可用。
我寻找将 PYTHONPATH 环境变量添加到 mod_fastcgi 的选项,但我没有看到这样的选项。也许这是一个通用的 Apache 选项,所以没有在 mod_fastcgi 中记录,或者可能无法在 mod_fastcgi 配置中设置静态变量。
鉴于此,我相信您可以使用以下解决方法:
虽然我没有一个好的测试环境,但我认为包装器 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
可能需要考虑其他解决方法。
与您以交互方式使用的环境相比,由 Web 服务器运行的程序或在 Web 服务器中运行的代码具有受限的环境。很可能,差异源于您的交互环境和 FastCGI 环境之间的差异。我不能告诉你的是,在这种情况下,哪种差异是至关重要的。
在 IIS (Windows) 下运行我的 Python 应用程序时,我遇到了类似的问题。我发现在 ISAPI 下运行时,egg 不可读,因为 setuptools 会破坏 zipped egg 的权限,并且因为 ISAPI 应用程序在受限权限帐户下运行。
您可能在 FastCGI 中遇到同样的情况。如果 FastCGI 进程无权读取鸡蛋或根据需要展开鸡蛋,您可能会遇到问题。此外,我发现将 PYTHON_EGG_CACHE 环境变量设置为进程可写的目录对于某些鸡蛋(特别是具有二进制/扩展模块或必须作为文件访问的资源的鸡蛋)也是必要的。
我同意即使定义了 PYTHONPATH 环境变量,当 python 在 FastCGI 环境中启动时,.pth 文件也不会被解释。我现在不知道为什么会这样,但我确实有一个解决方法的建议。
使用 site.addsitedir。它将解释 .pth 文件,使您可以简单地按名称导入鸡蛋,而无需为每个文件添加完整路径。
#!/user/bin/python2.6
import site
# adds a directory to sys.path and processes its .pth files
site.addsitedir('/home/mhanney/.local/lib/python2.6/site-packages/')
# avoids permissions error writing to system egg-cache
os.environ['PYTHON_EGG_CACHE'] = '/home/mhanney/.local/egg-cache'
没有必要使用虚拟环境。在我的共享托管服务提供商处,我只需在 ~/.local 中使用
python setup.py install --prefix=~/.local
这是flup“Hello World”示例的变体,用于转储环境变量、路径和模块,对调试FastCGI很有用。
#!/usr/bin/python2.6
import sys, os, site, StringIO
from pprint import pprint as p
# adds a directory to sys.path and processes its .pth files
site.addsitedir('/home/mhanney/.local/lib/python2.6/site-packages/')
# avoids permissions error writing to system egg-cache
os.environ['PYTHON_EGG_CACHE'] = '/home/mhanney/.local/egg-cache'
def test_app(environ, start_response):
output = StringIO.StringIO()
output.write("Environment:\n")
for param in os.environ.keys():
output.write("%s %s\n" % (param,os.environ[param]))
output.write("\n\nsys.path:\n")
p(sys.path, output)
output.write("\n\nsys.modules:\n")
p(sys.modules, output)
start_response('200 OK', [('Content-Type', 'text/plain')])
yield output.getvalue()
if __name__ == '__main__':
from flup.server.fcgi import WSGIServer
WSGIServer(test_app).run()