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.2k
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.3k
電子辞書にステータスバーを実装する
puhitaku
0
200
知育おもちゃの遊び方 Lv. 999
puhitaku
5
2.8k
ルーターでプレゼンする
puhitaku
1
5k
AST as Black Magic
puhitaku
0
120
次世代の足下を舗装するコミュニティ
puhitaku
5
1.7k
電子辞書で学ぶ Linux のサスペンド
puhitaku
0
620
USB PD で迎える AC アダプター大統一時代
puhitaku
2
2.6k
電子辞書のアイデンティティを消す方法
puhitaku
3
3.9k
Other Decks in Technology
See All in Technology
ハイテク休憩
sat
PRO
2
130
How to be an AWS Community Builder | 君もAWS Community Builderになろう!〜2024 冬 CB募集直前対策編?!〜
coosuke
PRO
2
2.8k
AI時代のデータセンターネットワーク
lycorptech_jp
PRO
1
280
[Ruby] Develop a Morse Code Learning Gem & Beep from Strings
oguressive
1
150
宇宙ベンチャーにおける最近の情シス取り組みについて
axelmizu
0
110
re:Invent 2024 Innovation Talks(NET201)で語られた大切なこと
shotashiratori
0
300
コンテナセキュリティのためのLandlock入門
nullpo_head
2
320
AIのコンプラは何故しんどい?
shujisado
1
190
Wvlet: A New Flow-Style Query Language For Functional Data Modeling and Interactive Data Analysis - Trino Summit 2024
xerial
1
110
Amazon SageMaker Unified Studio(Preview)、Lakehouse と Amazon S3 Tables
ishikawa_satoru
0
150
Microsoft Azure全冠になってみた ~アレを使い倒した者が試験を制す!?~/Obtained all Microsoft Azure certifications Those who use "that" to the full will win the exam! ?
yuj1osm
1
110
PHPからGoへのマイグレーション for DMMアフィリエイト
yabakokobayashi
1
160
Featured
See All Featured
The Cost Of JavaScript in 2023
addyosmani
45
7k
Product Roadmaps are Hard
iamctodd
PRO
49
11k
Reflections from 52 weeks, 52 projects
jeffersonlam
347
20k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
251
21k
Making the Leap to Tech Lead
cromwellryan
133
9k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
26
1.5k
For a Future-Friendly Web
brad_frost
175
9.4k
Why Our Code Smells
bkeepers
PRO
335
57k
The MySQL Ecosystem @ GitHub 2015
samlambert
250
12k
Raft: Consensus for Rubyists
vanstee
137
6.7k
Typedesign – Prime Four
hannesfritz
40
2.4k
Visualization
eitanlees
146
15k
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