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
16
pyconjp2024-wince
らすぴー
September 28, 2024
Tweet
Share
More Decks by らすぴー
See All by らすぴー
限界環境CPython rev. seccamp2025
raspython3
0
21
kernel-vm-ittekita-yuukousai
raspython3
0
63
kernelvm-brain-net
raspython3
0
860
seccamp2024-edictionary-python-TLS
raspython3
0
17
Other Decks in Technology
See All in Technology
スタートアップこそ全員で Platform Engineering スピードと持続性を両立する文化の作り方
anizozina
2
690
メディアカンパニー LINE NEWS QA採用
lycorptech_jp
PRO
0
220
Breaking the Paywall to Build In-App Purchases Securely
sohsatoh
0
420
品質保証に注目したAIプロダクト開発
sansantech
PRO
1
140
意外と難しいGraphQLのスカラー型
uhyo
4
230
Создание мультиагентной системы на базе AI Studio
shwars
0
130
「非更新サブスクリプション」って何者?
haseken_dev
0
190
20250920_ServerlessDays
takuyay0ne
9
2.6k
株式会社ログラス - 会社説明資料【エンジニア】/ Loglass Engineer
loglass2019
4
65k
AIがコード書きすぎ問題にはAIで立ち向かえ
jyoshise
13
10k
Wantedlyの開発組織における生成AIの浸透プロジェクトについて
kotominaga
2
190
LINEギフト/ショッピングタブ
lycorptech_jp
PRO
0
170
Featured
See All Featured
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4k
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
229
22k
Designing Experiences People Love
moore
142
24k
Making the Leap to Tech Lead
cromwellryan
135
9.5k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
31
2.2k
A Tale of Four Properties
chriscoyier
160
23k
Balancing Empowerment & Direction
lara
4
650
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
30
9.7k
Navigating Team Friction
lara
189
15k
Speed Design
sergeychernyshev
32
1.1k
Principles of Awesome APIs and How to Build Them.
keavy
127
17k
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