代码乘客_wsgi python
有人能解释一下为什么这段代码在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 以便进行持续部署的 笔记…