1

同意这个问题及其答案。我添加了鸡蛋的路径,它起作用了。但是,当我以交互方式运行 python 并导入 Flup 时,它可以正常工作,也没有任何额外的路径规范。区别在哪里?

编辑:似乎在做 fastcgi 的时候,.pth 文件没有被解析,但这只是一个猜测。需要更多官方声明。

4

4 回答 4

2

经过一些更彻底的分析,我想我明白这里发生了什么。

当 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 配置中设置静态变量。

鉴于此,我相信您可以使用以下解决方法:

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

虽然我没有一个好的测试环境,但我认为包装器 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.fgci 中,使 Python 根据新的更改环境重新处理 sys.path。我不知道这将如何完成,但这可能比使用包装脚本更干净。
  • 查找允许为 fastcgi 进程指定环境变量 (PYTHONPATH) 的 Apache/mod_fastcgi 选项。
于 2009-09-06T17:42:41.370 回答
0

与您以交互方式使用的环境相比,由 Web 服务器运行的程序或在 Web 服务器中运行的代码具有受限的环境。很可能,差异源于您的交互环境和 FastCGI 环境之间的差异。我不能告诉你的是,在这种情况下,哪种差异是至关重要的。

于 2009-09-06T02:20:09.823 回答
0

在 IIS (Windows) 下运行我的 Python 应用程序时,我遇到了类似的问题。我发现在 ISAPI 下运行时,egg 不可读,因为 setuptools 会破坏 zipped egg 的权限,并且因为 ISAPI 应用程序在受限权限帐户下运行。

您可能在 FastCGI 中遇到同样的情况。如果 FastCGI 进程无权读取鸡蛋或根据需要展开鸡蛋,您可能会遇到问题。此外,我发现将 PYTHON_EGG_CACHE 环境变量设置为进程可写的目录对于某些鸡蛋(特别是具有二进制/扩展模块或必须作为文件访问的资源的鸡蛋)也是必要的。

于 2009-09-06T03:01:20.317 回答
0

我同意即使定义了 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()
于 2010-09-20T01:43:10.970 回答