$30 off During Our Annual Pro Sale. View Details »

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

Takumi Sueda
September 18, 2018

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

PyCon JP 2018 Conference Day 2 15:45~

Takumi Sueda

September 18, 2018
Tweet

More Decks by Takumi Sueda

Other Decks in Technology

Transcript

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

    View Slide

  2. 荈䊹稱➜ 2
    • 爡ⰻדכ-JOVYװ'1("הְ׏׋⡚ٖ؎َ٦׾䬐䔲
    • չת׌1ZUIPO⢪׏ג׷׿דַׅպה鎉ֲ⤘
    • 1ZUIPO娖䎃 1ZUIPOדⰅꟌ
    • 䪮遭鐰锷爡8%#13&447PMחג1ZUIPO暴꧊㛁瘗
    1ZUIPOד״ֻ剅ֻֿה٥䖤䠐זذ٦و
    • ⤑ⵃ麣Ⱗ⡲׶
    • 鎉铂堣腉׾崞欽׃׋1ZUIPOٌآُ٦ٕ⡲׶
    • ًةفؚٗٓىؚٝ
    @puhitaku
    劣歊⼾䊻ִׅ׌׋ֻ׫
    (3007&9吳䒭⠓爡䨽㾩

    View Slide

  3. 50$
    ֶׁ׵ְ1ZUIPO儗➿ך穄提
    (3007&9爡ⰻדכ˘
    䭁䓸ٌآُ٦ٕך⯔ה䕦
    ✼䳔⻉׃״ֲ
    תה׭
    3

    View Slide

  4. 1ZUIPO儗➿ך穄提

    View Slide

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

    穄✪׃תׅ
    5

    View Slide

  6. 1ZUIPO儗➿ך穄提
    ְא穄׻׷
    ˖ 䎃剢傈
    ˖ デ濼䔲ⴱכ傈➰ָ寸ת׏גְזַ׏׋ָծ➙䎃剢ח然㹀
    ˖ https://github.com/python/devguide/pull/344
    ׍ז׫ח˘
    ˖ 1ZUIPOPSHה׃גך؟ه٦زכ穄׻׏ג׮ծ04ر؍أزٔؽُ٦
    ءّٝח״׏גכ䲿⣘ׁ׸竲ֽ׷׮ך׮
    ˖ ⢽6CVOUV-54䎃剢
    ‣ ؟ه٦ز㼎韋ךANBJOAٔهآزٔחָ֮׷
    ˖ ⢽3)&-䎃剢
    ‣ 植遤ךדEFQSFDBUF ד嶊ִ׷
    6

    View Slide

  7. 1ZUIPO儗➿ך穄提
    דֹ׷ꣲ׶傍ֻ

    1ZUIPOח獳遤׃׋ְ
    7

    View Slide

  8. 1ZUIPO儗➿ך穄提
    ּׅ1ZUIPOח獳遤הכְַזְ✲ָ㢳ְ
    فٗتؙزⰋ⡤ד1ZUIPO׾ؖحخٔ⢪׏גְ׷
    ӹ ;VMJQך獳遤⢽ָ꬗涯ְ

    https://qiita.com/t2y/items/2a1310608da7b5c4860b
    ֿך؝٦سח⣛㶷׃גְ׷ⴽך1ZUIPOך؝٦سָ֮׷
    爡ⰻך㡦孡ָ넝ת׵׆אְ1ZUIPOד剅ֻ➂ָ㢳ְ
    8
    ׃ַ׃˘

    䒦爡ך㜥さכֿ׸׵הכ麩ֲ㔭ꨇָ䖉׍「ֽגְ׋˘

    View Slide

  9. 1ZUIPO儗➿ך穄提 9
    䧮ղ׾㔭׵ׇ׋

    婍׷אך؛٦أָ˘

    View Slide

  10. 1ZUIPO儗➿ך穄提 10
    䧮ղ׾㔭׵ׇ׋

    婍׷אך؛٦أָ˘
    $ד剅ַ׸׋䭁䓸ٌآُ٦ٕ

    View Slide

  11. (3007&9爡ⰻדכ˘

    View Slide

  12. (3007&9爡ⰻדכ˘
    ؙٓؐسך״ֲזչֶꆃ׾琎׿ד䚍腉׾أ؛٦ٕպָ

    דֹזְ׋׭ծيتװنزٕطحؙכ噰⸂搀ֻ׃׋ְ
    暴ח⡚ٖ؎َ٦דծ㹋鄲ך嚂ׁ״׶׮넝鸞ז⹛⡲ָ銲実ׁ׸׷
    אךٌآُ٦ٕח㢳ֻך،فָٔ⣛㶷ׅ׷ֿהָ֮׷
    12
    䒦爡דכٗنحز׾⡲׏גְ׷׋׭ծ暴剣ך✲䞔ָ֮׷
    ٗنحزⰻד⢪׻׸׷Ⱏ剣ًٌٌٔآُ٦ָֿٕ׸ח鑩䔲׃׋

    View Slide

  13. (3007&9爡ⰻדכ˘
    Ⱏ剣ًٌٌٔآُ٦ٕ TIN
    הכ
    13
    ӹ إٝ؟װو؎؝ٝהװ׶ה׶ׅ׷⦼׾呓秛׃׋Ⱏ剣ًٌٔח،ؙإأׅ׷
    ٌآُ٦ٕ
    ӹ نزٕطحؙחז׷ה䚍腉ח湫䷼ׅ׷ךד㢳㼰؝٦سָꨇ׃ֻז׏גד׮
    鸞ֻ׃׋ְծ瘝ך椚歋ח״׶$"1*ぐ鎉铂ぢֽغ؎ٝر؍ؚٝ׾䱰欽
    ӹ ٗنحزךⵖ䖴ח♶〳妀זךד㢳ֻך،فָٔ⣛㶷
    3".
    TINٌآُ٦ٕ
    104*9Ⱏ剣ًٌٔ
    1ZUIPO
    ،فٔ
    TZOD

    EBFNPO
    TINٌآُ٦ٕ
    1ZUIPO
    ،فٔ
    1):

    41* *$

    و؎؝ٝ

    View Slide

  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*

    View Slide

  15. 䭁䓸ٌآُ٦ٕך⯔ה䕦

    View Slide

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

    View Slide

  17. 䭁䓸ٌآُ٦ٕך⯔ה䕦 17
    GSPNhttps://docs.python.jp/3/extending/extending.html
    ˑ$فؚٗٓيך剅ֹ倯׾濼׏גְ׷ז׵ծ1ZUIPOח倜׋ז

    穈׫鴥׫ٌآُ٦ٕ׾鷄⸇ׅ׷ךכֹ׻׭ג知⽃דׅկ˒
    ˑ倜׃ְ穈׫鴥׫ؔـآؙؑزך㹋鄲ծ׉׃גⰋגך$ٓ؎ـٓٔꟼ侧

    הءأذي؝٦ٕח㼎ׅ׷ㄎן⳿׃ծָדֹ׷״ֲחז׶תׅկ˒

    View Slide

  18. 䭁䓸ٌآُ٦ٕך⯔ה䕦 18
    GSPNhttps://docs.python.jp/3/extending/extending.html
    ˑ$فؚٗٓيך剅ֹ倯׾濼׏גְ׷ז׵ծ1ZUIPOח倜׋ז

    穈׫鴥׫ٌآُ٦ٕ׾鷄⸇ׅ׷ךכֹ׻׭ג知⽃דׅկ˒
    ˑ倜׃ְ穈׫鴥׫ؔـآؙؑزך㹋鄲ծ׉׃גⰋגך$ٓ؎ـٓٔꟼ侧

    הءأذي؝٦ٕח㼎ׅ׷ㄎן⳿׃ծָדֹ׷״ֲחז׶תׅկ˒
    ؕح؛٦

    View Slide

  19. 䭁䓸ٌآُ٦ٕך⯔ה䕦 19
    GSPNhttps://docs.python.org/ja/3/howto/cporting.html
    ˑ$䭁䓸ך؎ٝة٦ؿؑ؎أכ$1ZUIPOח㔿剣ך׮ךד֮׶ծ

    ֿ׸ח״׷䭁䓸ٌآُ٦ٕכקַך1ZUIPO㹋鄲דכ⹛⡲׃תׇ׿կ˒
    ˑ 1ZUIPOדכ
    㢌刿ָ׋ֻׁ׿֮׏׋ךדծ

    1ZUIPOך"1*׾搀⫊ד幥תׇ׷ֿהכדֹתׇ׿ד׃׋կ˒
    GSPNhttps://docs.python.jp/3/extending/extending.html

    View Slide

  20. 䭁䓸ٌآُ٦ٕך⯔ה䕦 20
    䭁䓸ٌآُ٦ٕך"1*חכ

    ًآٍ٦غ٦آّٝ꟦ד✼䳔䚍ָזְ
    1ZUIPO✼䳔חׅ׷חכ

    䗳׆何鸡ָ䗳銲

    View Slide

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

    View Slide

  22. ✼䳔⻉׃״ֲ

    View Slide

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

    View Slide

  24. ✼䳔⻉׃״ֲ
    pyconjp_2018_c_ext, beforeـٓٝثך⚥魦♧鿇殛
    libhelloworldהְֲ$䭁䓸ٌآُ٦ָٕ֮׶ծhelloworldػح؛٦آ

    ַ׵ㄎן⳿ׅկ1ZUIPOד⹛⡲ׅ׷կ
    24
    ְ׻ײ׷TFUVQQZ
    䭁䓸ٌآُ٦ٕ劤⡤
    䖓חlibhelloworld.soחז׷
    䭁䓸ٌآُ٦ٕ׾ㄎעػح؛٦آ

    View Slide

  25. 俑㶵⴨
    )FMMP 8PSME

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

    View Slide

  26. ✼䳔⻉׃״ֲ$箟 26
    pyconjp_2018_c_ext/src/helloworld.c
    ٌآُ٦ٕ

    ꟼ侧㹀纏
    ٌآُ٦ٕ

    ⴱ劍⻉
    ✼䳔⻉׃״ֲ 25

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  32. ✼䳔⻉׃״ֲ
    ד⹛⡲ָ然钠

    דֹ׋הֿ׹ד˘
    ד鑐׃ג׫ת׃׳ֲ
    32

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    ٌآُ٦ٕ׾钠陎דֹגְזְ
    39

    View Slide

  40. ✼䳔⻉׃״ֲ
    דכ˘
    void initϞδϡʔϧ໊ (void)הְֲءؚطثٍךꟼ侧ך⚥ד

    Py_InitModule("Ϟδϡʔϧ໊", PyMethodDef*); ׾㹋遤ׅ׷կ

    PyMethodDef*כծٌآُ٦ٕꟼ侧ךꂁ⴨
    40

    View Slide

  41. ✼䳔⻉׃״ֲ 41
    דכ˘
    PyModuleDef圓鸡⡤ך؎ٝأةٝأ׾⡲׶ծ

    PyMODINIT_FUNC PyInit_libϞδϡʔϧ໊(void);הְֲءؚطثٍך
    ꟼ侧ך⚥דPyModule_Create(*PyModuleDef)ח床׃PyObject*׾鵤ׅկ

    View Slide

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

    View Slide

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

    View Slide

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

    ♧⡤וֲׅ׸ל

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  48. ✼䳔⻉׃״ֲ 48
    ؝ٝػ؎ָٕ饥׷⵸ח؝٦س׉ך׮ך׾

    ⴖ׶剏ִ׸לְְ

    View Slide

  49. ✼䳔⻉׃״ֲ 49

    View Slide

  50. ✼䳔⻉׃״ֲ 50

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  58. ✼䳔⻉׃״ֲ 58
    ൜ਓ͸ Py_BuildValue鵤׶⦼ךةفٕ׾⡲׷ꟼ侧
    • "s#"٥٥٥char*ךꞿׁ׾䭷㹀׃ג1ZUIPOךstrח׃ג鵤ׅ
    • bin٥٥٥(unsigned char*) 0xfeedcafe
    • sizeof(bin)٥٥٥binךꞿׁɺͭ·Γ 4
    1ZUIPOדךTUSכײ׷ס׻غ؎ز⴨
    1ZUIPOדךTUSכ6OJDPEF俑㶵⴨
    Y'&ך儗挿ד6OJDPEFה׃ג鍑ꅸדֹזְ׋׭ؒٓ٦חז׷

    View Slide

  59. ✼䳔⻉׃״ֲ 59
    ⟣䠐ךغ؎ز⴨כ bytes ח׃ג鵤׃ת׃׳ֲ
    • "s#"٥٥٥char*ךꞿׁ׾䭷㹀׃ג1ZUIPOךstrח׃ג鵤ׅ
    • "y#"٥٥٥char*ךꞿׁ׾䭷㹀׃ג1ZUIPOךbytesח׃ג鵤ׅ

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  64. תה׭

    View Slide

  65. תה׭ 65
    1ZUIPOד✼䳔䚍ךזְ俑岀װٌآُ٦ٕכ

    @@GVUVSF@@ TJY QZUIPOGVUVSF瘝ד✼䳔䚍׾然⥂
    ٌآُ٦ٕךؒٝزٔه؎ٝزָⰋֻ殯ז׷鿇ⴓכ

    فٔفٗإح؟JG FMTF FOEJGד⛦׶ⴖ׷
    6OJDPEF%FDPEF&SSPSכקר黧麀׃תׅ

    TUS⢪欽皘䨽כCZUFTח湫ׅ䗳銲ָזְַثؑحؙ

    View Slide

  66. תה׭
    䞔㜠ꆀ㢳ְךד

    ֮הדׄ׏ֻ׶铣׿ד׫גֻ׌ְׁ
    66
    github.com/puhitaku/pyconjp_2018_c_ext

    View Slide