他の誰かがこれをすることを志願するならば、それについて私に尋ねてください:)
同じ投稿に来ました。 私は喜んでいますが、C拡張機能の経験は文字通りゼロです。 私が何か助けになることができたら私に知らせてください。 2から3への拡張機能の移植について説明している適切なツールまたはドキュメントを教えていただければ、それを注いで運試しをします。
移植する必要のあるものはそれほど多くないので、それほど難しいことではありません。
Py3ではPyString_foo
がなくなったため、ネイティブ文字列型(WSGI dict key / values)のマクロを使用する必要があります。
一般的なPy2-to-Py3移植のヘルプについては、 http: //rhodesmill.org/brandon/2008/porting-ac-extension-module-to-python-30/も参照してください。
ご不明な点がございましたら、お気軽にメールでお問い合わせください:)
記録のために、ここにPEP333とPEP3333の差分があります:http: //paste.pocoo.org/show/320496/
申し訳ありませんが、私はこれを自分で達成することはできません。 ここで何かが誰かの助けになることを願っています。 私は単にCを知りません。
私のフォークの現在の状態コードでは、vPy2は影響を受けない(動作している)ように見え、vPy3は少なくとも初期化できるようにコンパイルされます。 このバックトレースによると、最初のリクエストを行うとセグメンテーション違反が発生します。
http://docs.python.org/py3k/howto/cporting.htmlでは、以下の変更について説明しています。
request.c
のPyInt_FromLong
からPyLong_FromLong
に移動する必要がある2つのインスタンスを含む1行があります。
これらの定義は、 PyString
のすべてのインスタンスをカバーする必要があります。
http://docs.python.org/py3k/c-api/module.htmlに詳細が記載されています。
request.c
のcStringIO
は、標準のPyBytes
に置き換える必要があると思います。
1つのcString関数の代わりにmemcpy
を使用しましたが、 wsgi.input
の処理方法がわかりませんでした。 PycString_IMPORT
への呼び出しは、置き換えなしで削除されました。
モジュールの初期化:それは醜いです:-(彼らは少なくとも私たちから真実を隠すルーチンを提供することができたでしょう:-(
文字列:Py3のPyBytes
ではなく、Py3のヘッダーアイテムにPyUnicode
を使用し、Py2のPyString
を使用する必要があります。 PEP 3333 diffを読みましたか?
cStringIO:良い考えです。実際、cStringIOを使用する理由はまったくわかりません(コンテンツの長さがわかっているため、静的な文字列オブジェクトで十分です)。 ただし、WSGIアプリケーションを呼び出す前にcStringIOをファイルのように変換する必要があるため、Py3 cStringIO置換(それが何であれ)を使用するか、独自のラッパーをロールアウトします(私はそれを行うことができます)。
ところで、セグメンテーション違反は、要求の本文がないという理由だけで、渡された引数がNULLポインターであるためです。
モジュールの初期化:それは醜いです:-(彼らは少なくとも私たちから真実を隠すルーチンを提供することができたでしょう:-(
ええ、それは実際には<1KLOCにも役立ちません。 ボイラープレートの多くを実際に取り外したところですが、それほど悪くはありません。
文字列:Py3のPyBytesではなく、Py3のヘッダーアイテムとPy2のPyStringにPyUnicodeを使用する必要があります。 PEP 3333 diffを読みましたか?
ええ、十分ではありません。 私は実際に公式の差分を使用し、黄色で迷子になりました。ほとんどすべてがバイト文字列を参照しています。 あなたが正しい。 適切なコードをすべてPyBytesとPyUnicodeに置き換え、 define
をPyString forPy2xに戻しました。 environ
および/またはヘッダーはこのように処理する必要がありますか? HTTP/1.1 400 Bad Request
でPyUnicode_FromString
を使用すると、telnetはゴミを吐き出しますが、 PyBytes_FromString
は正常に機能します。
Googleは、マイナーな例外を除いて、参照されているcStringIOとPython3を見つけることができません。 これが1つです。 完全に削除しました
それは間違ったセグメンテーション違反でした、ごめんなさい。 私はすでに少なくともそのソースをたどっていました。 これは、 wsgi_app
が呼び出せないことについて不平を言っているので、実行可能なサーバーに近いと思います。 それを理解できれば、エンコーディングの問題をより適切に解決できるようになります。
ネイティブ文字列/ Unicode文字列のことを少し台無しにしていると思うので、ここにいくつかのヒントがあります:
2つのヘッダーファイルpy2.h
とpy3.h
を使用し、#すべての_used_ PyStr_*
ルーチンをPythonバージョンのネイティブデータ型( str
、= PyString
Py2ではPyUnicode
)。 次に、 PyBytes_*
マクロをPy2のPyString
に定義します(Py2のstr
はPy3のbytes
あるため)。 PyUnicode
は、PEP 3333が強調しているように、Python2を使用する場合はまったく使用されません。
応答は常にPyBytes
である必要があります:Python 2では、 PyString
はバイトであるため、エンコードを行う必要はありませんが、Python 3では、WSGIアプリケーションがPyUnicode
を返すかどうかはわかりません
あなたのセグメンテーション違反は非常に奇妙です。 私はあなたがどこか他の場所でrefcountsを台無しにしたと思います...誰もがそうすることを心配しないでください:)
on_body
を呼び出すたびに以前に受信したデータが上書きされるため、現在のcStringIO置換( memcpy
を使用)は壊れています。 memcpy
edデータの合計量を追跡する必要があります( bjparser
構造体を拡張します)。 また、 body = FromString(body)
(203行目)は不要であり、本文全体をコピーするため、削除します。
本当にありがとうございました!
ねえアンジェロ、Py3サポートに関するニュースはありますか?
ping! すぐにこれを復活させる計画はありますか? そうでなければ、私はそれを突き刺すかもしれません。
いいえ、計画はありません。 他の誰かによる移植https://github.com/isaiah/bjoern-py3がありますが、私はそれをテストしたことがなく、さらにコードが多すぎます(bytesioオブジェクト)。
bjoernがSO_REUSEPORTを実装した唯一のWSGIサーバーであることを知らせる古い問題の復活。 残念ながら使えません。
本気ですか? これは、すべてのサーバーが実装する必要がある標準機能です
私はこのプロジェクトが遅すぎることに気づきました:-(これまでずっと、nginxの周りで踊ることなく、軽量のPython Webサーバーを夢見ていました。Python3について本当に計画はありませんか?
いいえ。ただし、実装するのにそれほど複雑であってはならないので、CPython C APIの経験がある(またはそれを学ぶ気がある)場合は、遠慮なくお問い合わせください。
待ってください、Bjoernは2017年にPython 3をサポートしていません、そしてこの問題はまだ開いていますか? わお。 これはプロジェクトにとって実行可能なオプションではないと思います:(
@jonashaag私はそれを拾い上げてpython3で動作させました...これがマージするのに十分クリーンかどうかはわかりませんが、コメント/提案は大歓迎です。 :-)
最も参考になるコメント
@jonashaag私はそれを拾い上げてpython3で動作させました...これがマージするのに十分クリーンかどうかはわかりませんが、コメント/提案は大歓迎です。 :-)
https://github.com/jonashaag/bjoern/pull/104