如果其他人自愿这样做,就问我吧:)
来发同样的。 我愿意,但对 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_FromLong
到PyLong_FromLong
中的request.c
#$1$#$ 的实例。
这些定义应涵盖PyString
的所有实例。
http://docs.python.org/py3k/c-api/module.html提供了更多细节。
我相信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.h
和py3.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 服务器。 可惜我们不能用。
你确定吗? 这是每个服务器都应该实现的标准功能
我发现这个项目太晚了 :-( 一直以来我都梦想着轻量级的 Python web-server,没有任何关于 nginx 的舞蹈。你真的没有关于 Python3 的计划吗?
不,但实现起来应该不会太复杂,所以如果你对 CPython C API 有一些经验(或者愿意学习它),请随意!
等等,Bjoern 不支持 Python 3,在 2017 年,这个问题仍然存在? 哇。 我想这对于一个项目来说不是一个可行的选择:(
@jonashaag我拿起并使它适用于python3 ...不确定这是否足够干净可以合并,但欢迎评论/建议。 :-)
最有用的评论
@jonashaag我拿起并使它适用于python3 ...不确定这是否足够干净可以合并,但欢迎评论/建议。 :-)
https://github.com/jonashaag/bjoern/pull/104