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
pyconjp2024-wince
Search
らすぴー
September 28, 2024
Technology
33
0
Share
pyconjp2024-wince
らすぴー
September 28, 2024
More Decks by らすぴー
See All by らすぴー
限界環境CPython rev. seccamp2025
raspython3
0
35
kernel-vm-ittekita-yuukousai
raspython3
0
92
kernelvm-brain-net
raspython3
0
1k
seccamp2024-edictionary-python-TLS
raspython3
0
35
Other Decks in Technology
See All in Technology
最新の脅威動向から考える、コンテナサプライチェーンのリスクと対策
kyohmizu
1
700
Revisiting [CLS] and Patch Token Interaction in Vision Transformers
yu4u
0
350
AzureのIaC管理からログ調査まで、随所に役立つSkillsとCustom-Instructions / Boosting IaC and Log Analysis with Skills
aeonpeople
0
220
KGDC_13_Amazon Q Developerで挑む! 13事例から見えたAX組織変革の最前線_公開情報
kikugawa
0
120
Digitization部 紹介資料
sansan33
PRO
1
7.3k
Introduction to Sansan Meishi Maker Development Engineer
sansan33
PRO
0
390
Hacobu Tech Deck
hacobu
PRO
0
100
明日からドヤれる!超マニアックなAWSセキュリティTips10連発 / 10 Ultra-Niche AWS Security Tips
yuj1osm
0
570
All About Sansan – for New Global Engineers
sansan33
PRO
1
1.4k
社内エンジニア勉強会の醍醐味と苦しみ/tamadev
nishiuma
0
170
JEDAI in Osaka 2026イントロ
taka_aki
0
320
AgentCore×VPCでの設計パターンn選と勘所
har1101
3
270
Featured
See All Featured
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
340
Un-Boring Meetings
codingconduct
0
270
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
16k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
231
23k
Faster Mobile Websites
deanohume
310
31k
Product Roadmaps are Hard
iamctodd
PRO
55
12k
Abbi's Birthday
coloredviolet
2
7.1k
Ethics towards AI in product and experience design
skipperchong
2
260
Building Applications with DynamoDB
mza
96
7k
A Soul's Torment
seathinner
6
2.7k
Stop Working from a Prison Cell
hatefulcrawdad
274
21k
Skip the Path - Find Your Career Trail
mkilby
1
110
Transcript
Python3をWindows CEに 移植した話 らすぴー(@RasPython3) 1
目次 1. 事の発端 2. PythonCEとは 3. Pythonのバージョン選定 4. パッチ適用 5.
Pythonのビルドツール 6. ビルドツールの選定 7. configure.acの改造 8. Makefile.pre.inの改造 9. WinCEに無い関数の実装 10.コンソール問題 11.同名DLL 12.その他の問題 13.追加モジュールについて 2
事の発端 電子辞書でPythonをいじりたかったが、動作するPythonのバー ジョンが2.5と古かった そこでPython3はないのかと調べてみたが無さそう 3
事の発端 …じゃあ移植しちゃえばいいのでは 4
PythonCEとは • 2007年頃まで開発されていた、WinCEで動くCPython • v2.3.4-v2.5まで対応 • 独自コンソールにより対話モードが使用可能 • numarrayなど一部の追加モジュールも https://sourceforge.net/projects/pythonce/
5
Pythonのバージョン選定 移植開始時期 … 2023年4月頃 → v3.10.10 3.9 3.10 3.11 3.12
6
パッチ適用 Python2.5から時が流れ、WinCE用の記述はほぼ消えている そのため、2.5当時の記述を引っ張ってくる必要があった 手がかり • PythonCEのreadme • WinCE用のマクロ等 … _WIN32_WCEやMS_WINCE
• 3.6の時に適用された、WinCE対応の名残を削除するコミット 7
パッチ適用 https://github.com/python/cpython/commit/10108a7b9affa61719a1dc18 63edb2bdb3402fd1 Windows CEのサポートを削除した。 それは完了することはなく、Windows CEは もはやPythonに関連するプラットフォームではない。 8
Pythonのビルドツール • Makefile + gcc … LinuxとMac • VS +
VC++ … Windows • SCons + eVC4 … Windows CE (PythonCE) 9
ビルドツールの選定 当時使用できた環境 • Raspberry Pi 3B & ZeroW • Chromebook
→Windows系のビルドツールの使用が困難 →WinCE向けのgcc「cegcc」を使うしかない 10
ビルドツールの選定 そういえば… 1. Windows用の追加のソースはPC以下にまとまっている 2. Linuxで使うソースファイルの多くはWindowsでも使ってい る →Linuxのビルドスクリプトに手を加えたらどうにかなるのでは 11
configure.acの改造 まずは何も手を加えずに ./configure --host=mingw32ce --target=mingw32ce mingw32ceは非対応とエラー →WinCE用の記述を追加 12
Makefile.pre.inの改造 WinCEで使うソースファイルのリストを記述 • Windowsで使うソースファイル • PythonCEに存在したWinCE用のソースファイル • PC/wince_compatibility.* • PC/WinCE/_tkinter/*
• 今回の移植で新たに作成したファイル • WinCE/* • Modules/_io/winceconsoleio.c 13
WinCEに無い関数の実装 主にPC/wince_compatibility.*で対応 • strerr • wcsnlen • dup • CommandLineToArgvW
• CreateSymbolicLink • GetFileType • *_s 14
コンソール問題 コンソールがない場合(電子辞書など)、Pythonの標準入出力を扱 えない PythonCEでは独自のコンソールを用意していたが、Pythonのプ ログラムによる疑似コンソールだった →Win32APIで窓を作り、readlineやWriteConsoleを独自実装 15
コンソール問題 問題発生 … 電子辞書でstdinやstdoutが使えない stdin, stdout, stderrのファイル記述子は本来は0, 1, 2 そのすべてが無効になっていた(-1)
→filenoやisattyを別に実装して偽装 16
同名DLL WinCEでは、ロードを試みるDLLと同名のDLLをほかのプログラ ムがすでにロードしていた場合、ロード済みのDLLを使いまわす →複数のPythonが入っていると挙動がおかしくなる 例 • Python3の_tkinter.pydを読み込もうとしてPythonCEの _tkinter.pydを使おうとしてしまう • Python3.10.14のpython310.dllを使おうとしてpython3.10.0の
ものを使ってしまう 17
同名DLL 解決策 • *.pyd→*.cp310-wince_arm.pydに変更 • python310.dllとpython3.10.exe双方にハッシュ値を埋め込み、 実行時に検証する 18
その他の問題 • 環境変数がない environ.iniという設定ファイルを作成、また--env-setや--env-pathオプ ションを追加することで対応 • pyファイルを直接実行できない レジストリにpyファイルが登録されないため、pyファイルをダブルク リックしても実行できない →PYTHONASSOCIATEREGという環境変数によって、起動時にレジス
トリ設定をできるように 19
その他の問題 • ModuleNotFoundError: No module named ‘os’ なぜかosがインポートできない(!?) 原因: os.pyがOS.PYになっていた!
→PYTHONCASEOKを設定することにより対応 • python310._pthを使った時の挙動がなんか変 なんかドキュメントに書いてある通りの挙動じゃない… →ドキュメントの日本語訳が間違っていた! 20
追加モジュールについて 現在、以下の3つの追加モジュールが移植されている • cffi • cryptography • 現行バージョンはRust使用のため古いバージョンのみ • PyCryptoDome
21
追加モジュールについて cryptographyや標準のsslモジュールを動作させるためには OpenSSLが必要 海外の方で、OpenSSLをWinCEに移植している人がいた が、電子辞書では動作せず… さらに、そのビルドにはVCを使っていた https://www.hpcfactor.com/forums/forums/thread-view.asp?tid=20731&start=1 22
追加モジュールについて そこで、cegccでOpenSSLをビルドすることを試みた ところが、OpenSSLもerrnoや環境変数を使うためビルドに失敗 これらも独自に実装すると、かなり面倒なことになる →Pythonで使うことを前提に、python310.dllに依存させたら いいのでは 23
追加モジュールについて 結果…うまくいった! これがうまくいかなかった場合、別途フル装備のcoredllを 使わなければならず、ライセンスの問題で配布が困難だった 最終的に、Pythonのビルド途中でOpenSSLもビルドして、 PythonのDLLに変化があっても問題なく動作できるようにした 24