有没有办法在Python 3.x中运行Phusion Passenger?

3 投票
2 回答
907 浏览
提问于 2025-04-16 13:35

我正在尝试使用 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 个回答

-1

移植程序并不是简单地运行一个叫做2to3的工具,尤其是在WSGI应用中,因为WSGI的规范在Python 3中稍微做了一些修改。首先,你需要确保应用的测试(希望它有测试)能够在Python 3下正常运行。如果还有其他问题,遗憾的是,你得自己调试,找出到底是什么问题,这样才能解决它。

如果有错误追踪信息会比较有帮助,但看起来PP会吞掉这些追踪信息,只输出一个错误提示。

其实,使用你在开发应用时用的那个WSGI服务器可能会更简单一些。

0

现代的回答:

你可以通过在服务器配置、虚拟主机、目录或者 .htaccess 文件中设置 PassengerPython 变量来指定使用哪个 Python 解释器。

https://stackoverflow.com/a/52582232/1630632

撰写回答