代码乘客_wsgi python

0 投票
1 回答
1573 浏览
提问于 2025-04-17 21:26

有人能解释一下为什么这段代码在Dreamhost上显示的是一个新的Python版本吗?

import sys,os
# Force Passenger to run our virtualenv python
INTERP = "/home/site/env/bin/python"
if sys.executable != INTERP: os.execl(INTERP, INTERP, *sys.argv)
def application(environ, start_response):
    start_response('200 OK', [('Content-type', 'text/plain')])
    return ["Hello, world!" + sys.version]

而这段代码显示的是一个旧版本:

#!/home/site/env/bin/python
import sys
def application(environ, start_response):
    start_response('200 OK', [('Content-type', 'text/plain')])
    return ["Hello, world!" + sys.version]

1 个回答

1

如果你在 passenger_wsgi.py 文件里加一些调试代码来写日志文件:

x = open(os.path.expanduser('~/log.log'), 'w')
x.write(repr(sys.argv))
x.close()

然后查看 ~/log.log,你会发现加载 passenger_wsgi.py 的 Python 进程是通过运行 /dh/passenger/lib/phusion_passenger/wsgi/request_handler.py 启动的。

文件 /dh/passenger/lib/phusion_passenger/wsgi/request_handler.py 的第一行是

#!/usr/bin/env python

它通过调用

app_module = imp.load_source('passenger_wsgi', 'passenger_wsgi.py')

来加载 passenger_wsgi.py

因为 passenger_wsgi.py 是作为一个 Python 模块加载的,所以你第二个 passenger_wsgi.py 文件开头的 #!/home/site/env/bin/python 这一行会被当作 Python 注释处理,直接被忽略。系统会使用默认的 /usr/bin/python

解决这个问题的推荐方法正是你第一个 passenger_wsgi.py 文件所做的:使用 execl 来调用你实际想要的 Python 版本。我通常会在用户的主目录下编译 Python 2.7 并使用它。

顺便说一下,如果你感兴趣的话,我有一些关于在 Dreamhost 上设置 Django 以便进行持续部署的 笔记

撰写回答