Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
C拡張と共に乗り切るPython 2→3移行術
Search
Takumi Sueda
September 18, 2018
Technology
0
3.5k
C拡張と共に乗り切るPython 2→3移行術
PyCon JP 2018 Conference Day 2 15:45~
Takumi Sueda
September 18, 2018
Tweet
Share
More Decks by Takumi Sueda
See All by Takumi Sueda
組み込みLinuxの時系列
puhitaku
4
1.7k
電子辞書にステータスバーを実装する
puhitaku
0
280
知育おもちゃの遊び方 Lv. 999
puhitaku
5
3k
ルーターでプレゼンする
puhitaku
1
6k
AST as Black Magic
puhitaku
0
150
次世代の足下を舗装するコミュニティ
puhitaku
5
1.8k
電子辞書で学ぶ Linux のサスペンド
puhitaku
0
690
USB PD で迎える AC アダプター大統一時代
puhitaku
2
2.7k
電子辞書のアイデンティティを消す方法
puhitaku
3
4.1k
Other Decks in Technology
See All in Technology
Definition of Done
kawaguti
PRO
6
450
Amazon S3標準/ S3 Tables/S3 Express One Zoneを使ったログ分析
shigeruoda
2
380
第9回情シス転職ミートアップ_テックタッチ株式会社
forester3003
0
120
菸酒生在 LINE Taiwan 的後端雙刀流
line_developers_tw
PRO
0
1.1k
白金鉱業Meetup_Vol.19_PoCはデモで語れ!顧客の本音とインサイトを引き出すソリューション構築
brainpadpr
2
470
Oracle Audit Vault and Database Firewall 20 概要
oracle4engineer
PRO
2
1.6k
【TiDB GAME DAY 2025】Shadowverse: Worlds Beyond にみる TiDB 活用術
cygames
0
820
成立するElixirの再束縛(再代入)可という選択
kubell_hr
0
770
BrainPadプログラミングコンテスト記念LT会2025_社内イベント&問題解説
brainpadpr
0
150
VISITS_AIIoTビジネス共創ラボ登壇資料.pdf
iotcomjpadmin
0
140
AIエージェント最前線! Amazon Bedrock、Amazon Q、そしてMCPを使いこなそう
minorun365
PRO
10
3.5k
Claude Code どこまでも/ Claude Code Everywhere
nwiizo
53
31k
Featured
See All Featured
Producing Creativity
orderedlist
PRO
346
40k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
8
660
Reflections from 52 weeks, 52 projects
jeffersonlam
351
20k
Mobile First: as difficult as doing things right
swwweet
223
9.7k
Become a Pro
speakerdeck
PRO
28
5.4k
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
4
200
Facilitating Awesome Meetings
lara
54
6.4k
Imperfection Machines: The Place of Print at Facebook
scottboms
267
13k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
10
920
A Modern Web Designer's Workflow
chriscoyier
693
190k
Making the Leap to Tech Lead
cromwellryan
134
9.3k
Principles of Awesome APIs and How to Build Them.
keavy
126
17k
Transcript
$䭁䓸הⰟח⛦ⴖ1ZUIPO̔獳遤遭 CZ(3007&9 *OD劣歊⼾䊻 1Z$PO+1$POGFSFODF%BZ!㣐歊⼒欵噟فٓؠ1J0
荈䊹稱➜ 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 EBFNPO TINٌآُ٦ٕ 1ZUIPO ،فٔ 1): 41* *$ و؎؝ٝ
(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*
䭁䓸ٌآُ٦ٕך⯔ה䕦
䭁䓸ٌآُ٦ٕך⯔ה䕦 1ZUIPOPSHך سًُؗٝز刹ֻ 16
䭁䓸ٌآُ٦ٕך⯔ה䕦 17 GSPNhttps://docs.python.jp/3/extending/extending.html ˑ$فؚٗٓيך剅ֹ倯濼גְזծ1ZUIPOח倜ז 穈鴥ٌآُ٦ٕ鷄⸇ׅךכֹג知⽃דׅկ˒ ˑ倜׃ְ穈鴥ؔـآؙؑزך㹋鄲ծ׃גⰋגך$ٓ؎ـٓٔꟼ侧 הءأذي؝٦ٕח㼎ׅㄎן⳿׃ծָדֹ״ֲחזתׅկ˒
䭁䓸ٌآُ٦ٕך⯔ה䕦 18 GSPNhttps://docs.python.jp/3/extending/extending.html ˑ$فؚٗٓيך剅ֹ倯濼גְזծ1ZUIPOח倜ז 穈鴥ٌآُ٦ٕ鷄⸇ׅךכֹג知⽃דׅկ˒ ˑ倜׃ְ穈鴥ؔـآؙؑزך㹋鄲ծ׃גⰋגך$ٓ؎ـٓٔꟼ侧 הءأذي؝٦ٕח㼎ׅㄎן⳿׃ծָדֹ״ֲחזתׅկ˒ ؕح؛٦
䭁䓸ٌآُ٦ٕך⯔ה䕦 19 GSPNhttps://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ـٓٝث鋅嫰ץגי 23 github.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
✼䳔⻉׃״ֲ$箟 26 pyconjp_2018_c_ext/src/helloworld.c ٌآُ٦ٕ ꟼ侧㹀纏 ٌآُ٦ٕ ⴱ劍⻉ ✼䳔⻉׃״ֲ 25
✼䳔⻉׃״ֲ pyconjp_2018_c_ext/helloworld/__init__.py libhelloworldךꟼ侧ㄎן⳿ׅ؝٦سկ鋅湡鸐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 דׅ״י։
✼䳔⻉׃״ֲ ⥜姻IFMMPXPSME@@JOJU@@QZ ˖ ְאךfrom __future__ import print_function 35
✼䳔⻉׃״ֲ ٔكٝآ 36
✼䳔⻉׃״ֲ JNQPSU 37 כ
✼䳔⻉׃״ֲ JNQPSU 38 Symbol 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
✼䳔⻉׃״ֲ 52 JNQPSU䧭⸆ import helloworld
✼䳔⻉׃״ֲ 53 )FMMP8PSME䧭⸆ helloworld.hello()
✼䳔⻉׃״ֲ 54 6OJDPEF%FDPEF&SSPS helloworld.hello_hex()
✼䳔⻉׃״ֲ 55 6OJDPEF%FDPEF&SSPS helloworld.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ךꞿׁɺͭ·Γ 4 1ZUIPOדךTUSכײסغ؎ز 1ZUIPOדךTUSכ6OJDPEF俑㶵 Y'&ך儗挿ד6OJDPEFה׃ג鍑ꅸדֹזְؒٓ٦חז
✼䳔⻉׃״ֲ 59 ⟣䠐ךغ؎زכ bytes ח׃ג鵤׃ת׃׳ֲ • "s#"٥٥٥char*ךꞿׁ䭷㹀׃ג1ZUIPOךstrח׃ג鵤ׅ • "y#"٥٥٥char*ךꞿׁ䭷㹀׃ג1ZUIPOךbytesח׃ג鵤ׅ
✼䳔⻉׃״ֲ ٔٔٔكٝآ 60
✼䳔⻉׃״ֲ 61 JNQPSU䧭⸆ import helloworld
✼䳔⻉׃״ֲ 62 )FMMP8PSME䧭⸆ helloworld.hello()
✼䳔⻉׃״ֲ 63 Y'&&%$"'&䧭⸆ helloworld.hello_hex()
תה
תה 65 1ZUIPOד✼䳔䚍ךזְ俑岀װٌآُ٦ٕכ @@GVUVSF@@ TJY QZUIPOGVUVSF瘝ד✼䳔䚍然⥂ ٌآُ٦ٕךؒٝزٔه؎ٝزָⰋֻ殯ז鿇ⴓכ فٔفٗإح؟JG FMTF FOEJGד⛦ⴖ
6OJDPEF%FDPEF&SSPSכקר黧麀׃תׅ TUS⢪欽皘䨽כCZUFTח湫ׅ䗳銲ָזְַثؑحؙ
תה 䞔㜠ꆀ㢳ְךד ֮הדֻׄ铣דגְֻׁ 66 github.com/puhitaku/pyconjp_2018_c_ext