C拡張と共に乗り切るPython 2→3移行術

C825832c4fc71ffdfd44905729281fb0?s=47 Takumi Sueda
September 18, 2018

C拡張と共に乗り切るPython 2→3移行術

PyCon JP 2018 Conference Day 2 15:45~

C825832c4fc71ffdfd44905729281fb0?s=128

Takumi Sueda

September 18, 2018
Tweet

Transcript

  1. $䭁䓸הⰟח⛦׶ⴖ׷1ZUIPO̔獳遤遭 CZ(3007&9 *OD劣歊⼾䊻 1Z$PO+1$POGFSFODF%BZ!㣐歊⼒欵噟فٓؠ1J0

  2. 荈䊹稱➜ 2 • 爡ⰻדכ-JOVYװ'1("הְ׏׋⡚ٖ؎َ٦׾䬐䔲 • չת׌1ZUIPO⢪׏ג׷׿דַׅպה鎉ֲ⤘ • 1ZUIPO娖䎃 1ZUIPOדⰅꟌ •

    䪮遭鐰锷爡8&# %#13&447PMחג1ZUIPO暴꧊㛁瘗 1ZUIPOד״ֻ剅ֻֿה٥䖤䠐זذ٦و • ⤑ⵃ麣Ⱗ⡲׶ • 鎉铂堣腉׾崞欽׃׋1ZUIPOٌآُ٦ٕ⡲׶ • ًةفؚٗٓىؚٝ @puhitaku 劣歊⼾䊻ִׅ׌׋ֻ׫ (3007&9吳䒭⠓爡䨽㾩
  3. 50$  ֶׁ׵ְ1ZUIPO儗➿ך穄提  (3007&9爡ⰻדכ˘  䭁䓸ٌآُ٦ٕך⯔ה䕦  ✼䳔⻉׃״ֲ 

    תה׭ 3
  4. 1ZUIPO儗➿ך穄提

  5. 1ZUIPO儗➿ך穄提 勻׷䎃 1ZUIPOך؟ه٦زכ
 穄✪׃תׅ 5

  6. 1ZUIPO儗➿ך穄提 ְא穄׻׷ ˖ 䎃剢傈 ˖ デ濼䔲ⴱכ傈➰ָ寸ת׏גְזַ׏׋ָծ➙䎃剢ח然㹀 ˖ https://github.com/python/devguide/pull/344 ׍ז׫ח˘ ˖

    1ZUIPOPSHה׃גך؟ه٦زכ穄׻׏ג׮ծ04ر؍أزٔؽُ٦ ءّٝח״׏גכ䲿⣘ׁ׸竲ֽ׷׮ך׮ ˖ ⢽6CVOUV-54䎃剢 ‣ ؟ه٦ز㼎韋ךANBJOAٔهآزٔחָ֮׷ ˖ ⢽3)&-䎃剢 ‣ 植遤ךדEFQSFDBUF ד嶊ִ׷ 6
  7. 1ZUIPO儗➿ך穄提 דֹ׷ꣲ׶傍ֻ
 1ZUIPOח獳遤׃׋ְ 7

  8. 1ZUIPO儗➿ך穄提 ּׅ1ZUIPOח獳遤הכְַזְ✲ָ㢳ְ  فٗتؙزⰋ⡤ד1ZUIPO׾ؖحخٔ⢪׏גְ׷ ӹ ;VMJQך獳遤⢽ָ꬗涯ְ
 https://qiita.com/t2y/items/2a1310608da7b5c4860b  ֿך؝٦سח⣛㶷׃גְ׷ⴽך1ZUIPOך؝٦سָ֮׷ 

    爡ⰻך㡦孡ָ넝ת׵׆אְ1ZUIPOד剅ֻ➂ָ㢳ְ 8 ׃ַ׃˘
 䒦爡ך㜥さכֿ׸׵הכ麩ֲ㔭ꨇָ䖉׍「ֽגְ׋˘
  9. 1ZUIPO儗➿ך穄提 9 䧮ղ׾㔭׵ׇ׋
 婍׷אך؛٦أָ˘

  10. 1ZUIPO儗➿ך穄提 10 䧮ղ׾㔭׵ׇ׋
 婍׷אך؛٦أָ˘ $ד剅ַ׸׋䭁䓸ٌآُ٦ٕ

  11. (3007&9爡ⰻדכ˘

  12. (3007&9爡ⰻדכ˘  ؙٓؐسך״ֲזչֶꆃ׾琎׿ד䚍腉׾أ؛٦ٕպָ
 דֹזְ׋׭ծيتװنزٕطحؙכ噰⸂搀ֻ׃׋ְ  暴ח⡚ٖ؎َ٦דծ㹋鄲ך嚂ׁ״׶׮넝鸞ז⹛⡲ָ銲実ׁ׸׷  אךٌآُ٦ٕח㢳ֻך،فָٔ⣛㶷ׅ׷ֿהָ֮׷ 12 䒦爡דכٗنحز׾⡲׏גְ׷׋׭ծ暴剣ך✲䞔ָ֮׷

    ٗنحزⰻד⢪׻׸׷Ⱏ剣ًٌٌٔآُ٦ָֿٕ׸ח鑩䔲׃׋
  13. (3007&9爡ⰻדכ˘ Ⱏ剣ًٌٌٔآُ٦ٕ TIN הכ 13 ӹ إٝ؟װو؎؝ٝהװ׶ה׶ׅ׷⦼׾呓秛׃׋Ⱏ剣ًٌٔח،ؙإأׅ׷ ٌآُ٦ٕ ӹ نزٕطحؙחז׷ה䚍腉ח湫䷼ׅ׷ךד㢳㼰؝٦سָꨇ׃ֻז׏גד׮

    鸞ֻ׃׋ְծ瘝ך椚歋ח״׶$"1* ぐ鎉铂ぢֽغ؎ٝر؍ؚٝ׾䱰欽 ӹ ٗنحزךⵖ䖴ח♶〳妀זךד㢳ֻך،فָٔ⣛㶷 3". TINٌآُ٦ٕ 104*9Ⱏ剣ًٌٔ 1ZUIPO ،فٔ TZOD
 EBFNPO TINٌآُ٦ٕ 1ZUIPO ،فٔ 1): 
 41* *$  و؎؝ٝ
  14. (3007&9爡ⰻדכ˘ TINٌآُ٦ٕך⚥魦 ˖ TIN⡲䧭װ䱖➭ⵖ䖴 QUISFBENVUFY ׾$ד㹋鄲׃׋$"1* ˖ $"1*פך،ؙإأ׾䲿⣘ׅ׷$ ٥(P٥1ZUIPOغ؎ٝر؍ؚٝ $BMMTUBDL

    ⢽PQFO 14 1ZUIPO 1ZUIPOغ؎ٝر؍ؚٝ$䭁䓸ٌآُ٦ٕ liblovot_shm_py.so $"1* lovot_shm_py_open(PyObject* self, PyObject* args) lovot_shm_open(char* path) uint64_t PyObject*
  15. 䭁䓸ٌآُ٦ٕך⯔ה䕦

  16. 䭁䓸ٌآُ٦ٕך⯔ה䕦 1ZUIPOPSHך سًُؗٝز刹ֻ 16

  17. 䭁䓸ٌآُ٦ٕך⯔ה䕦 17 GSPNhttps://docs.python.jp/3/extending/extending.html ˑ$فؚٗٓيך剅ֹ倯׾濼׏גְ׷ז׵ծ1ZUIPOח倜׋ז
 穈׫鴥׫ٌآُ٦ٕ׾鷄⸇ׅ׷ךכֹ׻׭ג知⽃דׅկ˒ ˑ倜׃ְ穈׫鴥׫ؔـآؙؑزך㹋鄲ծ׉׃גⰋגך$ٓ؎ـٓٔꟼ侧
 הءأذي؝٦ٕח㼎ׅ׷ㄎן⳿׃ծָדֹ׷״ֲחז׶תׅկ˒

  18. 䭁䓸ٌآُ٦ٕך⯔ה䕦 18 GSPNhttps://docs.python.jp/3/extending/extending.html ˑ$فؚٗٓيך剅ֹ倯׾濼׏גְ׷ז׵ծ1ZUIPOח倜׋ז
 穈׫鴥׫ٌآُ٦ٕ׾鷄⸇ׅ׷ךכֹ׻׭ג知⽃דׅկ˒ ˑ倜׃ְ穈׫鴥׫ؔـآؙؑزך㹋鄲ծ׉׃גⰋגך$ٓ؎ـٓٔꟼ侧
 הءأذي؝٦ٕח㼎ׅ׷ㄎן⳿׃ծָדֹ׷״ֲחז׶תׅկ˒ ؕح؛٦

  19. 䭁䓸ٌآُ٦ٕך⯔ה䕦 19 GSPNhttps://docs.python.org/ja/3/howto/cporting.html ˑ$䭁䓸ך؎ٝة٦ؿؑ؎أכ$1ZUIPOח㔿剣ך׮ךד֮׶ծ
 ֿ׸ח״׷䭁䓸ٌآُ٦ٕכקַך1ZUIPO㹋鄲דכ⹛⡲׃תׇ׿կ˒ ˑ 1ZUIPOדכ 㢌刿ָ׋ֻׁ׿֮׏׋ךדծ
 1ZUIPOך"1*׾搀⫊ד幥תׇ׷ֿהכדֹתׇ׿ד׃׋կ˒ GSPNhttps://docs.python.jp/3/extending/extending.html

  20. 䭁䓸ٌآُ٦ٕך⯔ה䕦 20 䭁䓸ٌآُ٦ٕך"1*חכ
 ًآٍ٦غ٦آّٝ꟦ד✼䳔䚍ָזְ 1ZUIPO✼䳔חׅ׷חכ
 䗳׆何鸡ָ䗳銲

  21. 䭁䓸ٌآُ٦ٕך⯔ה䕦 㣐㢌׉ֲ׌ָ װ׷׃ַזְ 21

  22. ✼䳔⻉׃״ֲ

  23. ✼䳔⻉׃״ֲ ַֿֿ׵כ؟ٝفٕ׾⢪׏ג铡僇׃תׅ CFGPSFـٓٝثהBGUFSـٓٝث׾鋅嫰ץגי 23 github.com/puhitaku/pyconjp_2018_c_ext

  24. ✼䳔⻉׃״ֲ pyconjp_2018_c_ext, beforeـٓٝثך⚥魦♧鿇殛 libhelloworldהְֲ$䭁䓸ٌآُ٦ָٕ֮׶ծhelloworldػح؛٦آ
 ַ׵ㄎן⳿ׅկ1ZUIPOד⹛⡲ׅ׷կ 24 ְ׻ײ׷TFUVQQZ 䭁䓸ٌآُ٦ٕ劤⡤ 䖓חlibhelloworld.soחז׷ 䭁䓸ٌآُ٦ٕ׾ㄎעػح؛٦آ

  25. 俑㶵⴨ )FMMP 8PSME
 ׾鵤ׅꟼ侧 غ؎ز⴨ Y'&&%$"'& ׾鵤ׅꟼ侧 pyconjp_2018_c_ext/src/helloworld.c ✼䳔⻉׃״ֲ$箟 25

    ✼䳔⻉׃״ֲ 24
  26. ✼䳔⻉׃״ֲ$箟 26 pyconjp_2018_c_ext/src/helloworld.c ٌآُ٦ٕ
 ꟼ侧㹀纏 ٌآُ٦ٕ
 ⴱ劍⻉ ✼䳔⻉׃״ֲ 25

  27. ✼䳔⻉׃״ֲ pyconjp_2018_c_ext/helloworld/__init__.py libhelloworldךꟼ侧׾ㄎן⳿ׅ؝٦سկ鋅׋湡鸐׶1ZUIPOד⹛⡲ׅ׷կ 27

  28. ✼䳔⻉׃״ֲ pyconjp_2018_c_ext/setup.py 䭁䓸ٌآُ٦ٕךؽٕس䭷㹀ָ֮׷⟃㢩כ兛鸐ךsetup.pyկ 28

  29. ✼䳔⻉׃״ֲ pyconjp_2018_c_ext/setup.py 䭁䓸ٌآُ٦ٕךؽٕس䭷㹀ָ֮׷⟃㢩כ兛鸐ךsetup.pyկ 29

  30. ✼䳔⻉׃״ֲ 1ZUIPO  דך؎ٝأز٦ٕ 30

  31. ✼䳔⻉׃״ֲ 1ZUIPO  דך⹛⡲ 31

  32. ✼䳔⻉׃״ֲ ד⹛⡲ָ然钠
 דֹ׋הֿ׹ד˘ ד鑐׃ג׫ת׃׳ֲ 32

  33. ✼䳔⻉׃״ֲ$箟 1ZUIPO  דך؎ٝأز٦ٕ 33 搀⸇䊨ד׮ז׿ְְַ䠬ׄח4VDDFTTׅ׷

  34. ✼䳔⻉׃״ֲ 1ZUIPO  דך⹛⡲ 34 דׅ״י։

  35. ✼䳔⻉׃״ֲ ⥜姻IFMMPXPSME@@JOJU@@QZ ˖ ְא׮ךfrom __future__ import print_function 35

  36. ✼䳔⻉׃״ֲ ٔكٝآ 36

  37. ✼䳔⻉׃״ֲ JNQPSU 37 כ

  38. ✼䳔⻉׃״ֲ JNQPSU 38 Symbol not found: _Py_InitModule

  39. ✼䳔⻉׃״ֲ הדכ䭁䓸ٌآُ٦ٕך 㹑鎉٥ⴱ劍⻉倯岀ָ麩ֲ׋׭ 1ZUIPO⩎ד
 ٌآُ٦ٕ׾钠陎דֹגְזְ 39

  40. ✼䳔⻉׃״ֲ דכ˘ void initϞδϡʔϧ໊ (void)הְֲءؚطثٍךꟼ侧ך⚥ד
 Py_InitModule("Ϟδϡʔϧ໊", PyMethodDef*); ׾㹋遤ׅ׷կ
 PyMethodDef*כծٌآُ٦ٕꟼ侧ךꂁ⴨ 40

  41. ✼䳔⻉׃״ֲ 41 דכ˘ PyModuleDef圓鸡⡤ך؎ٝأةٝأ׾⡲׶ծ
 PyMODINIT_FUNC PyInit_libϞδϡʔϧ໊(void);הְֲءؚطثٍך ꟼ侧ך⚥דPyModule_Create(*PyModuleDef)ח床׃PyObject*׾鵤ׅկ

  42. ✼䳔⻉׃״ֲ ٥٥٥ 42

  43. ✼䳔⻉׃״ֲ ♧ַ׵⼧תד麩ֲ 43

  44. ✼䳔⻉׃״ֲ ♧ַ׵⼧תד麩ֲ 44 הו׍׵ד׮⢪ֲחכ
 ♧⡤וֲׅ׸ל

  45. ✼䳔⻉׃״ֲ 45 ֮׷ׄׯזְַ

  46. ✼䳔⻉׃״ֲ 46 $חכ ֮׷ׄׯזְַ

  47. ✼䳔⻉׃״ֲ 47 فٔفٗإح؟ָ $חכ ֮׷ׄׯזְַ

  48. ✼䳔⻉׃״ֲ 48 ؝ٝػ؎ָٕ饥׷⵸ח؝٦س׉ך׮ך׾
 ⴖ׶剏ִ׸לְְ

  49. ✼䳔⻉׃״ֲ 49

  50. ✼䳔⻉׃״ֲ 50

  51. ✼䳔⻉׃״ֲ ٔٔكٝآ 51

  52. ✼䳔⻉׃״ֲ 52 JNQPSU䧭⸆ import helloworld

  53. ✼䳔⻉׃״ֲ 53 )FMMP8PSME䧭⸆ helloworld.hello()

  54. ✼䳔⻉׃״ֲ 54 6OJDPEF%FDPEF&SSPS helloworld.hello_hex()

  55. ✼䳔⻉׃״ֲ 55 6OJDPEF%FDPEF&SSPS helloworld.hello_hex() ⸇ִג5SBDFCBDLך䞔㜠ך搀ׁ

  56. ✼䳔⻉׃״ֲ 56 וָֿ䚓׃ְה䙼ְתַׅ 月➂䱱׃ ΍ Ύ Ώ ΐ

  57. ✼䳔⻉׃״ֲ 57 ൜ਓ͸ Py_BuildValue • Py_BuildValue()٥٥٥鵤׶⦼ךةفٕ׾⡲׷ꟼ侧 • "s#"٥٥٥char*ךꞿׁ׾䭷㹀׃ג1ZUIPOךstrח׃ג鵤ׅ • bin٥٥٥(unsigned

    char*) 0xfeedcafe • sizeof(bin)٥٥٥binךꞿׁɺͭ·Γ 4
  58. ✼䳔⻉׃״ֲ 58 ൜ਓ͸ Py_BuildValue鵤׶⦼ךةفٕ׾⡲׷ꟼ侧 • "s#"٥٥٥char*ךꞿׁ׾䭷㹀׃ג1ZUIPOךstrח׃ג鵤ׅ • bin٥٥٥(unsigned char*) 0xfeedcafe

    • sizeof(bin)٥٥٥binךꞿׁɺͭ·Γ 4 1ZUIPOדךTUSכײ׷ס׻غ؎ز⴨ 1ZUIPOדךTUSכ6OJDPEF俑㶵⴨ Y'&ך儗挿ד6OJDPEFה׃ג鍑ꅸדֹזְ׋׭ؒٓ٦חז׷
  59. ✼䳔⻉׃״ֲ 59 ⟣䠐ךغ؎ز⴨כ bytes ח׃ג鵤׃ת׃׳ֲ • "s#"٥٥٥char*ךꞿׁ׾䭷㹀׃ג1ZUIPOךstrח׃ג鵤ׅ • "y#"٥٥٥char*ךꞿׁ׾䭷㹀׃ג1ZUIPOךbytesח׃ג鵤ׅ

  60. ✼䳔⻉׃״ֲ ٔٔٔكٝآ 60

  61. ✼䳔⻉׃״ֲ 61 JNQPSU䧭⸆ import helloworld

  62. ✼䳔⻉׃״ֲ 62 )FMMP8PSME䧭⸆ helloworld.hello()

  63. ✼䳔⻉׃״ֲ 63 Y'&&%$"'&䧭⸆ helloworld.hello_hex()

  64. תה׭

  65. תה׭ 65 1ZUIPOד✼䳔䚍ךזְ俑岀װٌآُ٦ٕכ
 @@GVUVSF@@ TJY QZUIPOGVUVSF瘝ד✼䳔䚍׾然⥂ ٌآُ٦ٕךؒٝزٔه؎ٝزָⰋֻ殯ז׷鿇ⴓכ
 فٔفٗإح؟JG FMTF FOEJGד⛦׶ⴖ׷

    6OJDPEF%FDPEF&SSPSכקר黧麀׃תׅ
 TUS⢪欽皘䨽כCZUFTח湫ׅ䗳銲ָזְַثؑحؙ
  66. תה׭ 䞔㜠ꆀ㢳ְךד
 ֮הדׄ׏ֻ׶铣׿ד׫גֻ׌ְׁ 66 github.com/puhitaku/pyconjp_2018_c_ext