有没有办法在Python 3.x中运行Phusion Passenger?
我正在尝试使用 Phusion Passenger 运行一个 Python 3 的 WSGI 应用。根据这个问题的信息,我可以让 Passenger 使用 Python 3,但似乎不可能在 Python 2.x 下运行一个 Python 3 的应用(也就是说,应用和 Passenger 必须在同一个 Python 解释器中运行)。所以我想我需要让 Passenger 在 3.x 版本下工作。
我对 Passenger 的 request_handler.py 文件运行了 2to3 工具,然后解决了剩下的运行时错误。但是当我运行这个应用时,日志中只显示了一个 502 错误,内容如下:
[error] 9839#0: *4 上游在读取响应头时提前关闭了连接,客户端: …, 服务器: _, 请求: "GET / HTTP/1.1", 上游: "passenger:unix:/passenger_helper_server:", 主机: "…"
同样的应用代码在 Python 2.x 下使用 Passenger 是可以正常工作的,所以我猜这和我对 request_handler.py 的 2to3 迁移有关。下面是我修改的差异部分。有什么想法吗?谢谢!
27c26
< import traceback
---
> import exceptions, traceback
29c28
< from socket import SocketIO
---
> from socket import _fileobject
65c64
< except Exception as e:
---
> except Exception, e:
67c66
< sys.stderr.write(str(e.__class__) + ": " + str(e) + "\n")
---
> sys.stderr.write(str(e.__class__) + ": " + e.message + "\n")
84c83
< buf = b''
---
> buf = ''
92c91
< buf = b''
---
> buf = ''
99c98
< headers = buf.split(b"\0")
---
> headers = buf.split("\0")
117c116
< env['wsgi.input'] = SocketIO(input_stream,'r',512)
---
> env['wsgi.input'] = _fileobject(input_stream,'r',512)
155c154
< raise exc_info[0](exc_info[1]).with_traceback(exc_info[2])
---
> raise exc_info[0], exc_info[1], exc_info[2]
2 个回答
移植程序并不是简单地运行一个叫做2to3的工具,尤其是在WSGI应用中,因为WSGI的规范在Python 3中稍微做了一些修改。首先,你需要确保应用的测试(希望它有测试)能够在Python 3下正常运行。如果还有其他问题,遗憾的是,你得自己调试,找出到底是什么问题,这样才能解决它。
如果有错误追踪信息会比较有帮助,但看起来PP会吞掉这些追踪信息,只输出一个错误提示。
其实,使用你在开发应用时用的那个WSGI服务器可能会更简单一些。
现代的回答:
你可以通过在服务器配置、虚拟主机、目录或者 .htaccess 文件中设置 PassengerPython 变量来指定使用哪个 Python 解释器。