Bjoern: Python 3 支持 (PEP 3333)

创建于 2011-01-13  ·  18评论  ·  资料来源: jonashaag/bjoern

如果其他人自愿这样做,就问我吧:)

最有用的评论

@jonashaag我拿起并使它适用于python3 ...不确定这是否足够干净可以合并,但欢迎评论/建议。 :-)

https://github.com/jonashaag/bjoern/pull/104

所有18条评论

来发同样的。 我愿意,但对 C 扩展的经验几乎为零。 如果我能帮上忙,请告诉我。 如果您可以为我指出一个体面的工具或描述从 2 到 3 的移植扩展的文档,我会倾注它并试试我的运气。

不应该太难,因为没有太多需要移植的东西。

由于PyString_foo在 Py3 中消失了,我们需要为原生字符串类型(WSGI dict key/values)使用宏。

另请参阅http://rhodesmill.org/brandon/2008/porting-ac-extension-module-to-python-30/了解一般 Py2-to-Py3 移植帮助。

如果您有任何问题,请随时写电子邮件:)

作为记录,这是 PEP 333 到 PEP 3333 的差异:http: //paste.pocoo.org/show/320496/

很抱歉,但我无法靠自己完成这项工作。 希望这里的东西可以对任何人有所帮助。 我根本不知道C。

在我的 fork 的当前状态代码编译使得 vPy2 似乎保持不受影响(工作)并且 vPy3 至少可以被初始化。 根据这个 backtrace ,我在发出第一个请求时收到一个段错误。


http://docs.python.org/py3k/howto/cporting.html描述了对以下内容的更改:

  • 多头/整数
  • 字符串
  • 模块

多头/整数

一行中有两个需要从PyInt_FromLongPyLong_FromLong中的request.c #$1$#$ 的实例。

字符串

这些定义应涵盖PyString的所有实例。

模块初始化

http://docs.python.org/py3k/c-api/module.html提供了更多细节。

cStringIO 已弃用

我相信cStringIO中的request.c应该替换为标准PyBytes

我用memcpy代替了一个 cString 函数,根本不知道如何处理wsgi.input 。 刚刚删除了对PycString_IMPORT的调用,没有替换。

模块初始化:哇,太丑了 :-( 他们至少可以提供一个例程,对我们隐藏真相 :-(

字符串:您应该在 Py3 中使用PyUnicode作为标题项目,在 Py2 中使用PyString ,而不是在 Py3 中使用PyBytes 。 你读过 PEP 3333 的差异吗?

cStringIO:好主意,实际上我不确定我为什么要使用 cStringIO(因为内容长度是已知的,所以静态字符串对象就足够了)。 但是 cStringIO 必须在调用 WSGI 应用程序之前转换为类似文件的文件,所以我们要么使用 Py3 cStringIO 替换(不管它是什么),要么推出我们自己的包装器(我可以这样做)。

顺便说一句,段错误是因为传递的参数是一个 NULL 指针,只是因为没有请求正文。

模块初始化:哇,太丑了 :-( 他们至少可以提供一个例程,向我们隐藏真相 :-(

是的,它也确实对 < 1KLOC 没有帮助。 实际上,我只是删除了大部分样板,它看起来并没有那么糟糕。

字符串:你应该在 Py3 和 Py2 中使用 PyUnicode,而不是 Py3 中的 PyBytes。 你读过 PEP 3333 的差异吗?

是的,还不够好。 我实际上使用了官方的差异并迷失在黄色中,几乎所有这些都指的是字节串。 你说得对。 我只是用 PyBytes 和 PyUnicode 替换了所有适当的代码,并将它们的define d 反转为 PyString for Py2x。 应该像这样处理environ和/或标题吗? 在 $#$ HTTP/1.1 400 Bad Request PyUnicode_FromString时,telnet 会吐出垃圾,但PyBytes_FromString工作正常..

谷歌未能找到一起引用的 cStringIO 和 Python3 以及轻微异常。 这是一个。 我刚刚完全删除了它

那是错误的段错误,对不起。 我至少已经追踪到它的来源。 这个抱怨wsgi_app不可调用,这使我认为我接近可运行的服务器。 如果我能弄清楚这一点,我将能够更好地解决编码问题。

我认为您有点搞砸了本机字符串/ unicode 字符串,所以这里有一些提示:

使用两个头文件py2.hpy3.h ,#defining所有_used_ PyStr_*例程到Python版本的本机数据类型( str , = PyString在 Py2 上和PyUnicode在 Py3 上)。 然后在 Py2 上将PyBytes_*宏定义为PyString (因为 Py2 的str是 Py3 的bytes )。 正如 PEP 3333 所强调的那样,在 Python 2 中根本不使用PyUnicode

响应必须始终是PyBytes :在 Python 2 上,您不必进行任何编码,因为PyString是字节,而在 Python 3 上,我不确定 WSGI 应用程序是否可能返回PyUnicode 。 如果允许,则必须以某种方式对该 unicode 字符串进行编码; 不过,我不知道选择哪种编码。

你的段错误很奇怪。 我猜你在其他地方搞砸了引用计数......别担心每个人都这样做:)

当前的 cStringIO 替换(使用memcpy )已损坏,因为对on_body的每次调用都会覆盖先前接收到的数据。 您必须跟踪memcpy ed 数据的总量(扩展bjparser结构)。 还要删除body = FromString(body) (第 203 行),因为它是不必要的,并且会进行完整的正文复制。

非常感谢您的努力!

嘿 Angelo,有关于 Py3 支持的消息吗?

平! 有没有计划在短期内重振它? 如果没有,我可能会尝试一下。

不,没有计划。 其他人有一个端口https://github.com/isaiah/bjoern-py3但我从未测试过它,而且它添加了太多代码(bytesio 对象)。

一个旧问题的复兴让您知道 bjoern 仍然是唯一具有 SO_REUSEPORT 实现的 WSGI 服务器。 可惜我们不能用。

你确定吗? 这是每个服务器都应该实现的标准功能

使用其中一些服务器,您可以传递已经打开的套接字,但在大多数情况下,它是如此令人费解,您甚至会后悔。

公平地说,uWSGI 可能以某种方式支持它,但是文档让我很生气。

我发现这个项目太晚了 :-( 一直以来我都梦想着轻量级的 Python web-server,没有任何关于 nginx 的舞蹈。你真的没有关于 Python3 的计划吗?

不,但实现起来应该不会太复杂,所以如果你对 CPython C API 有一些经验(或者愿意学习它),请随意!

等等,Bjoern 不支持 Python 3,在 2017 年,这个问题仍然存在? 哇。 我想这对于一个项目来说不是一个可行的选择:(

@jonashaag我拿起并使它适用于python3 ...不确定这是否足够干净可以合并,但欢迎评论/建议。 :-)

https://github.com/jonashaag/bjoern/pull/104

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

Varbin picture Varbin  ·  21评论

voroninman picture voroninman  ·  5评论

ryanisnan picture ryanisnan  ·  11评论

avloss picture avloss  ·  3评论

alexted picture alexted  ·  12评论