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 ν‚€/κ°’)에 λŒ€ν•œ 맀크둜λ₯Ό μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€.

λ˜ν•œ 일반적인 Py2-to-Py3 이식 도움말은 http://rhodesmill.org/brandon/2008/porting-ac-extension-module-to-python-30/ 을 μ°Έμ‘°ν•˜μ‹­μ‹œμ˜€.

질문이 μžˆμœΌμ‹œλ©΄ μ–Έμ œλ“ μ§€ 이메일을 λ³΄λ‚΄μ£Όμ„Έμš” :)

기둝을 μœ„ν•΄ λ‹€μŒμ€ PEP 333μ—μ„œ PEP 3333으둜의 μ°¨μ΄μž…λ‹ˆλ‹€. http://paste.pocoo.org/show/320496/

μ£„μ†‘ν•©λ‹ˆλ‹€λ§Œ, μ € ν˜Όμžμ„œλŠ” 이 일을 ν•΄λ‚Ό 수 없을 κ²ƒμž…λ‹ˆλ‹€. μ—¬κΈ°μ—μ„œ λˆ„κ΅°κ°€μ—κ²Œ 도움이 될 수 있기λ₯Ό λ°”λžλ‹ˆλ‹€. λ‚˜λŠ” λ‹¨μˆœνžˆ Cλ₯Ό λͺ¨λ₯Έλ‹€.

λ‚΄ 포크의 ν˜„μž¬ μƒνƒœ μ½”λ“œλŠ” vPy2κ°€ 영ν–₯을 받지 μ•Šκ³ (μž‘λ™) μœ μ§€λ˜κ³  vPy3이 μ΅œμ†Œν•œ μ΄ˆκΈ°ν™”λ  수 μžˆλ„λ‘ μ»΄νŒŒμΌλ©λ‹ˆλ‹€. 이 backtrace 에 따라 첫 번째 μš”μ²­μ„ ν•  λ•Œ segfaultλ₯Ό μˆ˜μ‹ ν•©λ‹ˆλ‹€.


http://docs.python.org/py3k/howto/cporting.html 은 λ‹€μŒμ— λŒ€ν•œ λ³€κ²½ 사항을 μ„€λͺ…ν•©λ‹ˆλ‹€.

  • long/int
  • λ¬Έμžμ—΄
  • λͺ¨λ“ˆ

Long/Int

$ request.c $ μ—μ„œ PyInt_FromLong μ—μ„œ PyLong_FromLong 둜 이동해야 ν•˜λŠ” 두 가지 μΈμŠ€ν„΄μŠ€κ°€ μžˆλŠ” ν•œ 쀄이 μžˆμŠ΅λ‹ˆλ‹€.

λ¬Έμžμ—΄

μ΄λŸ¬ν•œ μ •μ˜ λŠ” PyString 의 λͺ¨λ“  μΈμŠ€ν„΄μŠ€λ₯Ό 포함해야 ν•©λ‹ˆλ‹€.

λͺ¨λ“ˆ μ΄ˆκΈ°ν™”

http://docs.python.org/py3k/c-api/module.html 은 더 μžμ„Έν•œ 정보λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.

cStringIOλŠ” 더 이상 μ‚¬μš©λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

request.c 의 cStringIO λŠ” ν‘œμ€€ PyBytes 둜 λŒ€μ²΄λ˜μ–΄μ•Ό ν•œλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.

ν•˜λ‚˜μ˜ cString ν•¨μˆ˜ λŒ€μ‹  memcpy 을 μ‚¬μš©ν–ˆκ³  λ‹¨μˆœνžˆ wsgi.input λ₯Ό μ²˜λ¦¬ν•˜λŠ” 방법을 λͺ°λžμŠ΅λ‹ˆλ‹€. PycString_IMPORT 에 λŒ€ν•œ 호좜이 ꡐ체 없이 μ œκ±°λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

λͺ¨λ“ˆ μ΄ˆκΈ°ν™”: 와 정말 μΆ”ν•˜λ„€μš” :-( 그듀은 적어도 μš°λ¦¬μ—κ²Œ 진싀을 μˆ¨κΈ°λŠ” 루틴을 μ œκ³΅ν–ˆμ„ 수 μžˆμŠ΅λ‹ˆλ‹€ :-(

λ¬Έμžμ—΄: Py3의 헀더 ν•­λͺ©μ—λŠ” PyUnicode λ₯Ό, Py2μ—μ„œλŠ” PyString λ₯Ό μ‚¬μš©ν•΄μ•Ό ν•˜λ©°, Py3μ—μ„œλŠ” PyBytes λ₯Ό μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€. PEP 3333 diffλ₯Ό μ½μ—ˆμŠ΅λ‹ˆκΉŒ?

cStringIO: 쒋은 μƒκ°μž…λ‹ˆλ‹€. μ‹€μ œλ‘œ cStringIOλ₯Ό μ‚¬μš©ν•˜λŠ” 이유λ₯Ό μ „ν˜€ λͺ¨λ₯΄κ² μŠ΅λ‹ˆλ‹€(λ‚΄μš© 길이가 μ•Œλ €μ Έ μžˆμœΌλ―€λ‘œ 정적 λ¬Έμžμ—΄ 개체둜 μΆ©λΆ„ν•΄μ•Ό 함). κ·ΈλŸ¬λ‚˜ cStringIOλŠ” WSGI μ‘μš© ν”„λ‘œκ·Έλž¨μ„ ν˜ΈμΆœν•˜κΈ° 전에 파일과 같이 λ³€ν™˜λ˜μ–΄μ•Ό ν•˜λ―€λ‘œ Py3 cStringIO λŒ€μ²΄ν’ˆ(무엇이든 간에)을 μ‚¬μš©ν•˜κ±°λ‚˜ 자체 래퍼λ₯Ό λ‘€μ•„μ›ƒν•©λ‹ˆλ‹€(μ €λŠ” κ·Έλ ‡κ²Œ ν•  수 μžˆμŠ΅λ‹ˆλ‹€).

btw segfaultλŠ” μš”μ²­ 본문이 μ—†κΈ° λ•Œλ¬Έμ— μ „λ‹¬λœ μΈμˆ˜κ°€ NULL 포인터이기 λ•Œλ¬Έμž…λ‹ˆλ‹€.

λͺ¨λ“ˆ μ΄ˆκΈ°ν™”: 와 정말 μΆ”ν•˜λ„€μš” :-( 그듀은 적어도 μš°λ¦¬μ—κ²Œ 진싀을 μˆ¨κΈ°λŠ” 루틴을 μ œκ³΅ν–ˆμ„ 수 μžˆμŠ΅λ‹ˆλ‹€ :-(

예, < 1KLOC도 도움이 λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. μ‹€μ œλ‘œ μƒμš©κ΅¬μ˜ λ§Žμ€ 뢀뢄을 μ œκ±°ν–ˆλŠ”λ° κ·Έλ ‡κ²Œ λ‚˜λΉ  λ³΄μ΄μ§€λŠ” μ•ŠμŠ΅λ‹ˆλ‹€.

λ¬Έμžμ—΄: Py3의 PyBytesκ°€ μ•„λ‹ˆλΌ Py3의 헀더 ν•­λͺ©μ— PyUnicodeλ₯Ό μ‚¬μš©ν•˜κ³  Py2의 PyString을 μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€. PEP 3333 diffλ₯Ό μ½μ—ˆμŠ΅λ‹ˆκΉŒ?

예, μΆ©λΆ„νžˆ 쒋지 μ•ŠμŠ΅λ‹ˆλ‹€. λ‚˜λŠ” μ‹€μ œλ‘œ 곡식 diff λ₯Ό μ‚¬μš©ν–ˆκ³  λ…Έλž€μƒ‰μ—μ„œ 길을 μžƒμ—ˆμŠ΅λ‹ˆλ‹€. 거의 λͺ¨λ“  것이 λ°”μ΄νŠΈ λ¬Έμžμ—΄μ„ λ‚˜νƒ€λƒ…λ‹ˆλ‹€. λ„€κ°€ μ˜³μ•„. 방금 μ μ ˆν•œ λͺ¨λ“  μ½”λ“œλ₯Ό PyBytes 및 PyUnicode둜 κ΅μ²΄ν•˜κ³  define dλ₯Ό Py2x용 PyString으둜 λ°”κΏ¨μŠ΅λ‹ˆλ‹€. environ 및/λ˜λŠ” 헀더λ₯Ό 이와 같이 μ²˜λ¦¬ν•΄μ•Ό ν•©λ‹ˆκΉŒ? HTTP/1.1 400 Bad Request PyUnicode_FromString λ₯Ό μ‚¬μš©ν•  λ•Œ telnet은 μ“°λ ˆκΈ°λ₯Ό λ±‰μ§€λ§Œ PyBytes_FromString λŠ” 잘 μž‘λ™ν•©λ‹ˆλ‹€.

Google은 μ‚¬μ†Œν•œ μ˜ˆμ™Έμ™€ ν•¨κ»˜ μ°Έμ‘°λ˜λŠ” cStringIO 및 Python3을 찾지 λͺ»ν•©λ‹ˆλ‹€. μ—¬κΈ° ν•˜λ‚˜ κ°€ μžˆμŠ΅λ‹ˆλ‹€. 방금 μ™„μ „νžˆ μ œκ±°ν–ˆμŠ΅λ‹ˆλ‹€

그것은 잘λͺ»λœ segfaultμ˜€μŠ΅λ‹ˆλ‹€. μ£„μ†‘ν•©λ‹ˆλ‹€. λ‚˜λŠ” 이미 적어도 κ·Έ 좜처λ₯Ό μΆ”μ ν–ˆμŠ΅λ‹ˆλ‹€. 이것은 wsgi_app κ°€ 호좜 κ°€λŠ₯ν•˜μ§€ μ•Šλ‹€κ³  λΆˆν‰ν•˜μ—¬ λ‚΄κ°€ μ‹€ν–‰ κ°€λŠ₯ν•œ μ„œλ²„μ— 가깝닀고 μƒκ°ν•˜κ²Œ ν•©λ‹ˆλ‹€. 그것을 μ•Œμ•„λ‚Ό 수 μžˆλ‹€λ©΄ 인코딩 문제λ₯Ό 더 잘 ν•΄κ²°ν•  수 μžˆμ„ κ²ƒμž…λ‹ˆλ‹€.

λ„€μ΄ν‹°λΈŒ λ¬Έμžμ—΄/μœ λ‹ˆμ½”λ“œ λ¬Έμžμ—΄μ„ μ‘°κΈˆμ”© 망쳐 λ†“μ•˜λ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. κ·Έλž˜μ„œ 여기에 λͺ‡ 가지 팁이 μžˆμŠ΅λ‹ˆλ‹€.

두 개의 헀더 파일 py2.h 및 py3.h , #defining λͺ¨λ“  _used_ PyStr_* 루틴을 Python λ²„μ „μ˜ κΈ°λ³Έ 데이터 μœ ν˜•( str , = PyString Py2의 PyUnicode ). 그런 λ‹€μŒ PyBytes_* 맀크둜λ₯Ό Py2μ—μ„œ PyString 둜 μ •μ˜ν•©λ‹ˆλ‹€(Py2의 str κ°€ Py3의 bytes 이기 λ•Œλ¬Έμ—). PyUnicode λŠ” PEP 3333이 κ°•μ‘°ν•˜λŠ” κ²ƒμ²˜λŸΌ Python 2λ₯Ό μ‚¬μš©ν•˜μ—¬ μ „ν˜€ μ‚¬μš©λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

응닡은 항상 PyBytes μ—¬μ•Ό ν•©λ‹ˆλ‹€. Python 2μ—μ„œλŠ” PyString κ°€ λ°”μ΄νŠΈμ΄λ―€λ‘œ 인코딩을 μˆ˜ν–‰ν•  ν•„μš”κ°€ μ—†μ§€λ§Œ Python 3μ—μ„œλŠ” WSGI μ‘μš© ν”„λ‘œκ·Έλž¨μ΄ PyUnicode . ν—ˆμš©λ˜λŠ” 경우 ν•΄λ‹Ή μœ λ‹ˆμ½”λ“œ λ¬Έμžμ—΄μ€ μ–΄λ–»κ²Œλ“  μΈμ½”λ”©λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€. ν•˜μ§€λ§Œ μ–΄λ–€ 인코딩을 선택해야 할지 λͺ¨λ₯΄κ² μŠ΅λ‹ˆλ‹€.

κ·€ν•˜μ˜ segfaultλŠ” 맀우 μ΄μƒν•©λ‹ˆλ‹€. λ‚˜λŠ” 당신이 λ‹€λ₯Έ κ³³μ—μ„œ refcountλ₯Ό μ—‰λ§μœΌλ‘œ λ§Œλ“  것 κ°™μŠ΅λ‹ˆλ‹€ ... λͺ¨λ‘κ°€ κ±±μ •ν•˜μ§€ λ§ˆμ‹­μ‹œμ˜€ :)

on_body 에 λŒ€ν•œ λͺ¨λ“  호좜이 이전에 μˆ˜μ‹ λœ 데이터λ₯Ό μž¬μ •μ˜ν•˜κΈ° λ•Œλ¬Έμ— ν˜„μž¬ cStringIO λŒ€μ²΄( memcpy μ‚¬μš©)κ°€ μ€‘λ‹¨λ˜μ—ˆμŠ΅λ‹ˆλ‹€. memcpy ed λ°μ΄ν„°μ˜ μ΄λŸ‰μ„ 좔적해야 ν•©λ‹ˆλ‹€( bjparser ꡬ쑰체 ν™•μž₯). λ˜ν•œ body = FromString(body) (203ν–‰)은 λΆˆν•„μš”ν•˜κ³  전체 λ³Έλ¬Έ 볡사λ₯Ό μˆ˜ν–‰ν•˜κΈ° λ•Œλ¬Έμ— μ œκ±°ν•©λ‹ˆλ‹€.

λ…Έλ ₯ν•΄ μ£Όμ…”μ„œ λŒ€λ‹¨νžˆ κ°μ‚¬ν•©λ‹ˆλ‹€!

μ•ˆλ…•ν•˜μ„Έμš” Angelo, Py3 지원에 λŒ€ν•œ μ†Œμ‹μ΄ μžˆμŠ΅λ‹ˆκΉŒ?

ν•‘! μ‘°λ§Œκ°„ 이λ₯Ό λΆ€ν™œμ‹œν‚¬ κ³„νšμ΄ μžˆμŠ΅λ‹ˆκΉŒ? 그렇지 μ•ŠμœΌλ©΄ 찔릴 μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

μ•„λ‹ˆ, κ³„νšμ΄ μ—†μŠ΅λ‹ˆλ‹€. https://github.com/isaiah/bjoern-py3 λ‹€λ₯Έ μ‚¬λžŒμ΄ λ§Œλ“  ν¬νŠΈκ°€ μžˆμ§€λ§Œ ν…ŒμŠ€νŠΈν•œ 적이 μ—†μœΌλ©° λ„ˆλ¬΄ λ§Žμ€ μ½”λ“œ(bytesio 개체)λ₯Ό μΆ”κ°€ν•©λ‹ˆλ‹€.

bjoern이 μ—¬μ „νžˆ SO_REUSEPORT κ΅¬ν˜„μ„ 가진 μœ μΌν•œ WSGI μ„œλ²„λΌλŠ” 것을 μ•Œλ €μ£ΌλŠ” 였래된 문제 λΆ€ν™œ. μš°λ¦¬κ°€ 그것을 μ‚¬μš©ν•  수 μ—†λ‹€λŠ” 것이 μœ κ°μž…λ‹ˆλ‹€.

ν™•μ‹€ν•©λ‹ˆκΉŒ? 이것은 λͺ¨λ“  μ„œλ²„κ°€ κ΅¬ν˜„ν•΄μ•Ό ν•˜λŠ” ν‘œμ€€ κΈ°λŠ₯μž…λ‹ˆλ‹€.

μ΄λŸ¬ν•œ μ„œλ²„ 쀑 일뢀λ₯Ό μ‚¬μš©ν•˜λ©΄ 이미 μ—΄λ¦° μ†ŒμΌ“μ„ 전달할 수 μžˆμ§€λ§Œ λŒ€λΆ€λΆ„μ˜ 경우 λ„ˆλ¬΄ λ³΅μž‘ν•˜μ—¬ μƒκ°λ§Œ 해도 ν›„νšŒν•  κ²ƒμž…λ‹ˆλ‹€.

κ³΅μ •ν•˜κ²Œ λ§ν•˜λ©΄ uWSGIλŠ” μ–΄λ–€ μ‹μœΌλ‘œλ“  이λ₯Ό μ§€μ›ν•˜μ§€λ§Œ λ¬Έμ„œκ°€ λ‚˜λ₯Ό 죽이고 μžˆμŠ΅λ‹ˆλ‹€.

이 ν”„λ‘œμ νŠΈλ₯Ό λ„ˆλ¬΄ 늦게 μ°Ύμ•˜μŠ΅λ‹ˆλ‹€ :-(이 λͺ¨λ“  μ‹œκ°„ λ™μ•ˆ λ‚˜λŠ” nginx μ£Όλ³€μ—μ„œ μ–΄λ–€ 좀도 없이 κ°€λ²Όμš΄ Python μ›Ή μ„œλ²„λ₯Ό 꿈꾸고 μžˆμŠ΅λ‹ˆλ‹€. Python3에 λŒ€ν•΄ μ •λ§λ‘œ κ³„νšμ΄ μ—†μŠ΅λ‹ˆκΉŒ?

μ•„λ‹ˆμš”, ν•˜μ§€λ§Œ κ΅¬ν˜„ν•˜κΈ°κ°€ λ„ˆλ¬΄ λ³΅μž‘ν•΄μ„œλŠ” μ•ˆ λ©λ‹ˆλ‹€. λ”°λΌμ„œ CPython C API에 λŒ€ν•œ κ²½ν—˜μ΄ μžˆκ±°λ‚˜ 배우고자 ν•˜λŠ” 경우 자유둭게 ν•˜μ‹­μ‹œμ˜€!

잠깐, Bjoern은 2017년에 Python 3을 μ§€μ›ν•˜μ§€ μ•ŠμœΌλ©° 이 λ¬Έμ œκ°€ μ—¬μ „νžˆ μ—΄λ € μžˆμŠ΅λ‹ˆκΉŒ? 와. λ‚˜λŠ” 이것이 ν”„λ‘œμ νŠΈμ— μ‹€ν–‰ κ°€λŠ₯ν•œ μ˜΅μ…˜μ΄ μ•„λ‹ˆλΌκ³  μƒκ°ν•©λ‹ˆλ‹€ :(

@jonashaag λ‚΄κ°€ 집어 λ“€κ³  python3μ—μ„œ μž‘λ™ν•˜λ„λ‘ λ§Œλ“€μ—ˆμŠ΅λ‹ˆλ‹€ ... 이것이 λ³‘ν•©ν•˜κΈ°μ— μΆ©λΆ„νžˆ κΉ¨λ—ν•œμ§€ ν™•μ‹€ν•˜μ§€ μ•Šμ§€λ§Œ 의견/μ œμ•ˆμ€ ν™˜μ˜ν•©λ‹ˆλ‹€. :-)

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

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰

κ΄€λ ¨ 문제

Varbin picture Varbin  Β·  21μ½”λ©˜νŠΈ

avloss picture avloss  Β·  3μ½”λ©˜νŠΈ

alexted picture alexted  Β·  12μ½”λ©˜νŠΈ

thedrow picture thedrow  Β·  22μ½”λ©˜νŠΈ

ryanisnan picture ryanisnan  Β·  11μ½”λ©˜νŠΈ