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
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Takumi Sueda
September 18, 2018
Technology
0
3.8k
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
これまでのハード遊びまとめ ノンストップ40分スペシャル
puhitaku
1
210
令和最新版 OpenWrt を 22 年前のルーターで動かす
puhitaku
0
5.5k
組み込みLinuxの時系列
puhitaku
4
1.9k
電子辞書にステータスバーを実装する
puhitaku
0
360
知育おもちゃの遊び方 Lv. 999
puhitaku
5
3.3k
ルーターでプレゼンする
puhitaku
1
7.2k
AST as Black Magic
puhitaku
0
190
次世代の足下を舗装するコミュニティ
puhitaku
5
1.9k
電子辞書で学ぶ Linux のサスペンド
puhitaku
0
770
Other Decks in Technology
See All in Technology
Phase07_実務適用
overflowinc
0
1.6k
20260320_JaSST26_Tokyo_登壇資料.pdf
mura_shin
0
110
Zero Data Loss Autonomous Recovery Service サービス概要
oracle4engineer
PRO
4
13k
How to install a gem
indirect
0
780
「捨てる」を設計する
kubell_hr
0
200
20年以上続く PHP 大規模プロダクトを Kubernetes へ ── クラウド基盤刷新プロジェクトの4年間
oogfranz
PRO
0
170
Phase09_自動化_仕組み化
overflowinc
0
1.5k
Goのerror型がシンプルであることの恩恵について理解する
yamatai1212
1
300
FastMCP OAuth Proxy with Cognito
hironobuiga
3
170
Phase06_ClaudeCode実践
overflowinc
0
1.8k
PostgreSQL 18のNOT ENFORCEDな制約とDEFERRABLEの関係
yahonda
0
110
1GB RAMのラズピッピで何ができるのか試してみよう / 20260319-rpijam-1gb-rpi-whats-possible
akkiesoft
0
850
Featured
See All Featured
Why Your Marketing Sucks and What You Can Do About It - Sophie Logan
marketingsoph
0
120
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
61k
The Invisible Side of Design
smashingmag
302
51k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
Tips & Tricks on How to Get Your First Job In Tech
honzajavorek
0
460
Public Speaking Without Barfing On Your Shoes - THAT 2023
reverentgeek
1
340
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
1
3.5k
WCS-LA-2024
lcolladotor
0
490
世界の人気アプリ100個を分析して見えたペイウォール設計の心得
akihiro_kokubo
PRO
68
38k
YesSQL, Process and Tooling at Scale
rocio
174
15k
The State of eCommerce SEO: How to Win in Today's Products SERPs - #SEOweek
aleyda
2
10k
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
3.2k
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