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
0
19
pyconjp2024-wince
らすぴー
September 28, 2024
Tweet
Share
More Decks by らすぴー
See All by らすぴー
限界環境CPython rev. seccamp2025
raspython3
0
25
kernel-vm-ittekita-yuukousai
raspython3
0
68
kernelvm-brain-net
raspython3
0
910
seccamp2024-edictionary-python-TLS
raspython3
0
20
Other Decks in Technology
See All in Technology
AWS Media Services 最新サービスアップデート 2025
eijikominami
0
110
プロダクト負債と歩む持続可能なサービスを育てるための挑戦
sansantech
PRO
1
870
新しい風。SolidFlutterで実現するシンプルな状態管理
zozotech
PRO
0
130
変わるもの、変わらないもの :OSSアーキテクチャで実現する持続可能なシステム
gree_tech
PRO
0
240
re:Inventにおける製造業のこれまでとこれから
hamadakoji
0
320
FFMとJVMの実装から学ぶJavaのインテグリティ
kazumura
0
160
クラスタ統合リアーキテクチャ全貌~1,000万ユーザーのウェルネスSaaSを再設計~
hacomono
PRO
0
140
How We Built a Secure Sandbox Platform for AI
flatt_security
1
110
AIと自動化がもたらす業務効率化の実例: 反社チェック等の調査・業務プロセス自動化
enpipi
0
780
JavaScript パーサーに using 対応をする過程で与えたエコシステムへの影響
baseballyama
1
140
JJUG CCC 2025 Fall バッチ性能!!劇的ビフォーアフター
hayashiyuu1
1
410
技術広報のOKRで生み出す 開発組織への価値 〜 カンファレンス協賛を通して育む学びの文化 〜 / Creating Value for Development Organisations Through Technical Communications OKRs — Nurturing a Culture of Learning Through Conference Sponsorship —
pauli
5
520
Featured
See All Featured
What's in a price? How to price your products and services
michaelherold
246
12k
BBQ
matthewcrist
89
9.9k
Art, The Web, and Tiny UX
lynnandtonic
303
21k
Building a Modern Day E-commerce SEO Strategy
aleyda
45
8.1k
Speed Design
sergeychernyshev
33
1.2k
The Cost Of JavaScript in 2023
addyosmani
55
9.3k
Product Roadmaps are Hard
iamctodd
PRO
55
12k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.3k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
359
30k
Optimizing for Happiness
mojombo
379
70k
A Modern Web Designer's Workflow
chriscoyier
697
190k
The Language of Interfaces
destraynor
162
25k
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