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.3k
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.5k
電子辞書にステータスバーを実装する
puhitaku
0
220
知育おもちゃの遊び方 Lv. 999
puhitaku
5
2.9k
ルーターでプレゼンする
puhitaku
1
5.1k
AST as Black Magic
puhitaku
0
120
次世代の足下を舗装するコミュニティ
puhitaku
5
1.8k
電子辞書で学ぶ Linux のサスペンド
puhitaku
0
630
USB PD で迎える AC アダプター大統一時代
puhitaku
2
2.6k
電子辞書のアイデンティティを消す方法
puhitaku
3
3.9k
Other Decks in Technology
See All in Technology
ドメイン駆動設計の実践により事業の成長スピードと保守性を両立するショッピングクーポン
lycorptech_jp
PRO
13
2.2k
AIアプリケーション開発でAzure AI Searchを使いこなすためには
isidaitc
1
120
生成AIのビジネス活用
seosoft
0
110
Unsafe.BitCast のすゝめ。
nenonaninu
0
200
メールヘッダーを見てみよう
hinono
0
110
#TRG24 / David Cuartielles / Post Open Source
tarugoconf
0
590
FODにおけるホーム画面編成のレコメンド
watarukudo
PRO
2
280
When Windows Meets Kubernetes…
pichuang
0
310
AWSマルチアカウント統制環境のすゝめ / 20250115 Mitsutoshi Matsuo
shift_evolve
0
120
Bring Your Own Container: When Containers Turn the Key to EDR Bypass/byoc-avtokyo2024
tkmru
0
860
My small contributions - Fujiwara Tech Conference 2025
ijin
0
1.4k
0→1事業こそPMは営業すべし / pmconf #落選お披露目 / PM should do sales in zero to one
roki_n_
PRO
1
1.5k
Featured
See All Featured
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
120k
What’s in a name? Adding method to the madness
productmarketing
PRO
22
3.2k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
113
50k
Large-scale JavaScript Application Architecture
addyosmani
510
110k
[RailsConf 2023] Rails as a piece of cake
palkan
53
5.1k
GitHub's CSS Performance
jonrohan
1030
460k
Build your cross-platform service in a week with App Engine
jlugia
229
18k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
3
180
A Philosophy of Restraint
colly
203
16k
Building a Scalable Design System with Sketch
lauravandoore
460
33k
Learning to Love Humans: Emotional Interface Design
aarron
274
40k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
27
1.5k
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