PyCon JP 2018 Conference Day 2 15:45~
$䭁䓸הⰟח⛦ⴖ1ZUIPO̔獳遤遭CZ(3007&9 *OD劣歊⼾䊻1Z$PO+1$POGFSFODF%BZ!㣐歊⼒欵噟فٓؠ1J0
View Slide
荈䊹稱➜ 2• 爡ⰻדכ-JOVYװ'1("הְ⡚ٖ؎َ٦䬐䔲• չת1ZUIPO⢪גדַׅպה鎉ֲ⤘• 1ZUIPO娖䎃 1ZUIPOדⰅ• 䪮遭鐰锷爡8%#13&447PMחג1ZUIPO暴꧊㛁瘗1ZUIPOד״ֻ剅ֻֿה٥䖤䠐זذ٦و• ⤑ⵃ麣Ⱗ⡲• 鎉铂堣腉崞欽׃1ZUIPOٌآُ٦ٕ⡲• ًةفؚٗٓىؚٝ@puhitaku劣歊⼾䊻ִֻׅ(3007&9吳䒭⠓爡䨽㾩
50$ ְֶׁ1ZUIPO儗➿ך穄提 (3007&9爡ⰻדכ˘ 䭁䓸ٌآُ٦ٕך⯔ה䕦 ✼䳔⻉׃״ֲ תה3
1ZUIPO儗➿ך穄提
1ZUIPO儗➿ך穄提勻䎃1ZUIPOך؟ه٦زכ 穄✪׃תׅ5
1ZUIPO儗➿ך穄提ְא穄˖ 䎃剢傈˖ デ濼䔲ⴱכ傈➰ָ寸תגְזַָծ➙䎃剢ח然㹀˖ https://github.com/python/devguide/pull/344זח˘˖ 1ZUIPOPSHה׃גך؟ه٦زכ穄גծ04ر؍أزٔؽُ٦ءّٝח״גכ䲿⣘ׁ竲ֽך˖ ⢽6CVOUV-54䎃剢‣ ؟ه٦ز㼎韋ךANBJOAٔهآزٔחָ֮˖ ⢽3)&-䎃剢‣ 植遤ךדEFQSFDBUF ד嶊ִ6
1ZUIPO儗➿ך穄提דֹꣲ傍ֻ 1ZUIPOח獳遤׃ְ7
1ZUIPO儗➿ך穄提ּׅ1ZUIPOח獳遤הכְַזְ✲ָ㢳ְ فٗتؙزⰋ⡤ד1ZUIPOؖحخٔ⢪גְӹ ;VMJQך獳遤⢽ָ涯ְ https://qiita.com/t2y/items/2a1310608da7b5c4860b ֿך؝٦سח⣛㶷׃גְⴽך1ZUIPOך؝٦سָ֮ 爡ⰻך㡦孡ָ넝ת׆אְ1ZUIPOד剅ֻ➂ָ㢳ְ8׃ַ׃˘ 䒦爡ך㜥さכֿהכ麩ֲ㔭ꨇָ䖉「ֽגְ˘
1ZUIPO儗➿ך穄提 9䧮ղ㔭ׇ 婍אך؛٦أָ˘
1ZUIPO儗➿ך穄提 10䧮ղ㔭ׇ 婍אך؛٦أָ˘$ד剅ַ䭁䓸ٌآُ٦ٕ
(3007&9爡ⰻדכ˘
(3007&9爡ⰻדכ˘ ؙٓؐسך״ֲזչֶꆃ琎ד䚍腉أ؛٦ٕպָ דֹזְծيتװنزٕطحؙכ噰⸂搀ֻ׃ְ 暴ח⡚ٖ؎َ٦דծ㹋鄲ך嚂ׁ״넝鸞ז⹛⡲ָ銲実ׁ אךٌآُ٦ٕח㢳ֻך،فָٔ⣛㶷ֿׅהָ֮12䒦爡דכٗنحز⡲גְծ暴剣ך✲䞔ָ֮ٗنحزⰻד⢪Ⱏ剣ًٌٌٔآُ٦ָֿٕח鑩䔲׃
(3007&9爡ⰻדכ˘Ⱏ剣ًٌٌٔآُ٦ٕ TINהכ13ӹ إٝ؟װو؎؝ٝהװהׅ⦼呓秛׃Ⱏ剣ًٌٔח،ؙإأٌׅآُ٦ٕӹ نزٕطحؙחזה䚍腉ח湫䷼ׅךד㢳㼰؝٦سָꨇ׃ֻזגד鸞ֻ׃ְծ瘝ך椚歋ח״$"1*ぐ鎉铂ぢֽغ؎ٝر؍ؚٝ䱰欽ӹ ٗنحزךⵖ䖴ח♶〳妀זךד㢳ֻך،فָٔ⣛㶷3".TINٌآُ٦ٕ104*9Ⱏ剣ًٌٔ1ZUIPO،فٔTZOD EBFNPOTINٌآُ٦ٕ1ZUIPO،فٔ1): 41* *$ و؎؝ٝ
(3007&9爡ⰻדכ˘TINٌآُ٦ٕך⚥魦˖ TIN⡲䧭װ䱖➭ⵖ䖴 QUISFBENVUFY$ד㹋鄲׃$"1*˖ $"1*פך،ؙإأ䲿⣘ׅ$٥(P٥1ZUIPOغ؎ٝر؍ؚٝ$BMMTUBDL ⢽PQFO141ZUIPO1ZUIPOغ؎ٝر؍ؚٝ$䭁䓸ٌآُ٦ٕ liblovot_shm_py.so$"1*lovot_shm_py_open(PyObject* self, PyObject* args)lovot_shm_open(char* path) uint64_tPyObject*
䭁䓸ٌآُ٦ٕך⯔ה䕦
䭁䓸ٌآُ٦ٕך⯔ה䕦1ZUIPOPSHךسًُؗٝز刹ֻ16
䭁䓸ٌآُ٦ٕך⯔ה䕦 17GSPNhttps://docs.python.jp/3/extending/extending.htmlˑ$فؚٗٓيך剅ֹ倯濼גְזծ1ZUIPOח倜ז 穈鴥ٌآُ٦ٕ鷄⸇ׅךכֹג知⽃דׅկ˒ˑ倜׃ְ穈鴥ؔـآؙؑزך㹋鄲ծ׃גⰋגך$ٓ؎ـٓٔꟼ侧 הءأذي؝٦ٕח㼎ׅㄎן⳿׃ծָדֹ״ֲחזתׅկ˒
䭁䓸ٌآُ٦ٕך⯔ה䕦 18GSPNhttps://docs.python.jp/3/extending/extending.htmlˑ$فؚٗٓيך剅ֹ倯濼גְזծ1ZUIPOח倜ז 穈鴥ٌآُ٦ٕ鷄⸇ׅךכֹג知⽃דׅկ˒ˑ倜׃ְ穈鴥ؔـآؙؑزך㹋鄲ծ׃גⰋגך$ٓ؎ـٓٔꟼ侧 הءأذي؝٦ٕח㼎ׅㄎן⳿׃ծָדֹ״ֲחזתׅկ˒ؕح؛٦
䭁䓸ٌآُ٦ٕך⯔ה䕦 19GSPNhttps://docs.python.org/ja/3/howto/cporting.htmlˑ$䭁䓸ך؎ٝة٦ؿؑ؎أכ$1ZUIPOח㔿剣ךךד֮ծ ֿח״䭁䓸ٌآُ٦ٕכקַך1ZUIPO㹋鄲דכ⹛⡲׃תׇկ˒ˑ 1ZUIPOדכ㢌刿ָֻׁ֮ךדծ 1ZUIPOך"1*搀⫊ד幥תׇֿהכדֹתׇד׃կ˒GSPNhttps://docs.python.jp/3/extending/extending.html
䭁䓸ٌآُ٦ٕך⯔ה䕦 20䭁䓸ٌآُ٦ٕך"1*חכ ًآٍ٦غ٦آّٝד✼䳔䚍ָזְ1ZUIPO✼䳔חׅחכ 䗳׆何鸡ָ䗳銲
䭁䓸ٌآُ٦ٕך⯔ה䕦㣐㢌ֲָװ׃ַזְ21
✼䳔⻉׃״ֲ
✼䳔⻉׃״ֲַֿֿכ؟ٝفٕ⢪ג铡僇׃תׅCFGPSFـٓٝثהBGUFSـٓٝث鋅嫰ץגי23github.com/puhitaku/pyconjp_2018_c_ext
✼䳔⻉׃״ֲpyconjp_2018_c_ext, beforeـٓٝثך⚥魦♧鿇殛libhelloworldהְֲ$䭁䓸ٌآُ٦ָٕ֮ծhelloworldػح؛٦آ ַㄎן⳿ׅկ1ZUIPOד⹛⡲ׅկ24ְײTFUVQQZ䭁䓸ٌآُ٦ٕ劤⡤䖓חlibhelloworld.soחז䭁䓸ٌآُ٦ٕㄎעػح؛٦آ
俑㶵)FMMP 8PSME 鵤ׅꟼ侧غ؎زY'&&%$"'&鵤ׅꟼ侧pyconjp_2018_c_ext/src/helloworld.c✼䳔⻉׃״ֲ$箟 25✼䳔⻉׃״ֲ 24
✼䳔⻉׃״ֲ$箟 26pyconjp_2018_c_ext/src/helloworld.cٌآُ٦ٕ ꟼ侧㹀纏ٌآُ٦ٕ ⴱ劍⻉✼䳔⻉׃״ֲ 25
✼䳔⻉׃״ֲpyconjp_2018_c_ext/helloworld/__init__.pylibhelloworldךꟼ侧ㄎן⳿ׅ؝٦سկ鋅湡鸐1ZUIPOד⹛⡲ׅկ27
✼䳔⻉׃״ֲpyconjp_2018_c_ext/setup.py䭁䓸ٌآُ٦ٕךؽٕس䭷㹀ָ֮⟃㢩כ兛鸐ךsetup.pyկ28
✼䳔⻉׃״ֲpyconjp_2018_c_ext/setup.py䭁䓸ٌآُ٦ٕךؽٕس䭷㹀ָ֮⟃㢩כ兛鸐ךsetup.pyկ29
✼䳔⻉׃״ֲ1ZUIPO דך؎ٝأز٦ٕ30
✼䳔⻉׃״ֲ1ZUIPO דך⹛⡲31
✼䳔⻉׃״ֲד⹛⡲ָ然钠 דֹהֿד˘ד鑐׃גת׃׳ֲ32
✼䳔⻉׃״ֲ$箟1ZUIPO דך؎ٝأز٦ٕ33搀⸇䊨דזְְַ䠬ׄח4VDDFTTׅ
✼䳔⻉׃״ֲ1ZUIPO דך⹛⡲34דׅ״י։
✼䳔⻉׃״ֲ⥜姻[email protected]@[email protected]@QZ˖ ְאךfrom __future__ import print_function35
✼䳔⻉׃״ֲٔكٝآ36
✼䳔⻉׃״ֲJNQPSU37כ
✼䳔⻉׃״ֲJNQPSU38Symbol not found: _Py_InitModule
✼䳔⻉׃״ֲהדכ䭁䓸ٌآُ٦ٕך㹑鎉٥ⴱ劍⻉倯岀ָ麩ֲ1ZUIPO⩎ד ٌآُ٦ٕ钠陎דֹגְזְ39
✼䳔⻉׃״ֲדכ˘void initϞδϡʔϧ໊ (void)הְֲءؚطثٍךꟼ侧ך⚥ד Py_InitModule("Ϟδϡʔϧ໊", PyMethodDef*); 㹋遤ׅկ PyMethodDef*כծٌآُ٦ٕꟼ侧ךꂁ40
✼䳔⻉׃״ֲ 41דכ˘PyModuleDef圓鸡⡤ך؎ٝأةٝأ⡲ծ PyMODINIT_FUNC PyInit_libϞδϡʔϧ໊(void);הְֲءؚطثٍךꟼ侧ך⚥דPyModule_Create(*PyModuleDef)ח床׃PyObject*鵤ׅկ
✼䳔⻉׃״ֲ٥٥٥42
✼䳔⻉׃״ֲ♧ַ⼧תד麩ֲ43
✼䳔⻉׃״ֲ♧ַ⼧תד麩ֲ44הוד⢪ֲחכ ♧⡤וֲׅל
✼䳔⻉׃״ֲ 45֮ׄׯזְַ
✼䳔⻉׃״ֲ 46$חכ֮ׄׯזְַ
✼䳔⻉׃״ֲ 47فٔفٗإح؟ָ$חכ֮ׄׯזְַ
✼䳔⻉׃״ֲ 48؝ٝػ؎ָٕ饥ח؝٦سךך ⴖ剏ִלְְ
✼䳔⻉׃״ֲ 49
✼䳔⻉׃״ֲ 50
✼䳔⻉׃״ֲٔٔكٝآ51
✼䳔⻉׃״ֲ 52JNQPSU䧭⸆import helloworld
✼䳔⻉׃״ֲ 53)FMMP8PSME䧭⸆helloworld.hello()
✼䳔⻉׃״ֲ 546OJDPEF%FDPEF&SSPShelloworld.hello_hex()
✼䳔⻉׃״ֲ 556OJDPEF%FDPEF&SSPShelloworld.hello_hex()⸇ִג5SBDFCBDLך䞔㜠ך搀ׁ
✼䳔⻉׃״ֲ 56וָֿ䚓׃ְה䙼ְתַׅ月➂䱱׃ΎΏΐ
✼䳔⻉׃״ֲ 57൜ਓ Py_BuildValue• Py_BuildValue()٥٥٥鵤⦼ךةفٕ⡲ꟼ侧• "s#"٥٥٥char*ךꞿׁ䭷㹀׃ג1ZUIPOךstrח׃ג鵤ׅ• bin٥٥٥(unsigned char*) 0xfeedcafe• sizeof(bin)٥٥٥binךꞿׁɺͭ·Γ 4
✼䳔⻉׃״ֲ 58൜ਓ Py_BuildValue鵤⦼ךةفٕ⡲ꟼ侧• "s#"٥٥٥char*ךꞿׁ䭷㹀׃ג1ZUIPOךstrח׃ג鵤ׅ• bin٥٥٥(unsigned char*) 0xfeedcafe• sizeof(bin)٥٥٥binךꞿׁɺͭ·Γ 41ZUIPOדךTUSכײסغ؎ز1ZUIPOדךTUSכ6OJDPEF俑㶵Y'&ך儗挿ד6OJDPEFה׃ג鍑ꅸדֹזְؒٓ٦חז
✼䳔⻉׃״ֲ 59⟣䠐ךغ؎زכ bytes ח׃ג鵤׃ת׃׳ֲ• "s#"٥٥٥char*ךꞿׁ䭷㹀׃ג1ZUIPOךstrח׃ג鵤ׅ• "y#"٥٥٥char*ךꞿׁ䭷㹀׃ג1ZUIPOךbytesח׃ג鵤ׅ
✼䳔⻉׃״ֲٔٔٔكٝآ60
✼䳔⻉׃״ֲ 61JNQPSU䧭⸆import helloworld
✼䳔⻉׃״ֲ 62)FMMP8PSME䧭⸆helloworld.hello()
✼䳔⻉׃״ֲ 63Y'&&%$"'&䧭⸆helloworld.hello_hex()
תה
תה 651ZUIPOד✼䳔䚍ךזְ俑岀װٌآُ٦ٕכ @@[email protected]@ TJY QZUIPOGVUVSF瘝ד✼䳔䚍然⥂ٌآُ٦ٕךؒٝزٔه؎ٝزָⰋֻ殯ז鿇ⴓכ فٔفٗإح؟JG FMTF FOEJGד⛦ⴖ6OJDPEF%FDPEF&SSPSכקר黧麀׃תׅ TUS⢪欽皘䨽כCZUFTח湫ׅ䗳銲ָזְַثؑحؙ
תה䞔㜠ꆀ㢳ְךד ֮הדֻׄ铣דגְֻׁ66github.com/puhitaku/pyconjp_2018_c_ext