feat(python): 在 app 进程里起 40250 脚本层(2P step 4,macOS)

移植 UserInterface/RunMainScript 到 platform/ScriptLib/PythonBoot:40250 把
CPythonLauncher 放在 Main() 的栈上,这里进程归 Godot,launcher 必须活过创建它的
那次调用,所以拆成 Start / RunMainScript / RunLine / Stop。37 个模块初始化函数里
只调已移植的 initpack(),system.py 因此仍停在第一个 import。

脚本报错能传回 GDScript,靠的是 platform/EterBase/Debug.cpp 实现 LogBox/LogBoxf:
ScriptLib 的 Traceback() 在 PyErr_Fetch 之后只剩这一条路,LastLogBoxMessage()
(platform/EterBase/LogBox.h)是 traceback 唯一幸存的地方。

GDScript 侧新增 Metin2PythonHost(python_host_node.{h,cpp})——唯一同时认识
godot-cpp 和 port 树的单元,PythonBoot 保持 godot-free。检查脚本
python_host_check.gd 分两段:解释器 + 标准库那段不需要 40250 的 pack,哪个平台都
能跑;system.py 那段需要 pack,没有就跳过。桌面入口 python_host_test.gd,真机入口
MT_TEST_MODE=python(导出模板不接受 --script)。

验证(macOS):标准库可 import、codec 注册表可用、sys.path 非空,system.py 停在和
ctest port.python_launcher 完全相同的 ImportError: No module named app;
ctest 27/27。Android/iOS 进程内未做,正式启动路径仍不起解释器(2V0)。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
shenlei
2026-09-23 10:43:10 +09:00
co-authored by Claude Opus 5
parent e926759ff5
commit 0a1cdf3d3e
16 changed files with 638 additions and 76 deletions
+69
View File
@@ -0,0 +1,69 @@
{
"reference": "EterBase/Debug.cpp",
"reference_sha256": "af7a6cba9e6d83511a40f596629f85f1b770b510fc0db1d9cbefcec88ecb15ec",
"priority": "P4",
"contracts": [],
"functions": {
"SetLogLevel": {
"status": "TODO"
},
"Log": {
"status": "TODO"
},
"Logn": {
"status": "TODO"
},
"Logf": {
"status": "TODO"
},
"Lognf": {
"status": "TODO"
},
"Trace": {
"status": "TODO"
},
"Tracen": {
"status": "TODO"
},
"Tracenf": {
"status": "TODO"
},
"Tracef": {
"status": "TODO"
},
"TraceError": {
"status": "TODO"
},
"TraceErrorWithoutEnter": {
"status": "TODO"
},
"LogBoxf": {
"impl": [
"extension/src/platform/EterBase/Debug.cpp:LogBoxf"
],
"status": "ADAPTED",
"note": "verbatim apart from two PORT fixes the 40250 build did not need: va_end (40250 leaks the va_list) and terminating szBuf, which _vsnprintf does not do on truncation.",
"test": "project/python_host_check.gd — system.py's ImportError reaches GDScript through it"
},
"LogBox": {
"impl": [
"extension/src/platform/EterBase/Debug.cpp:LogBox"
],
"status": "ADAPTED",
"note": "40250 pops a MessageBox on g_PopupHwnd and Tracen()s the text. No window here: the text goes to stderr and is kept in LastLogBoxMessage() (extension/src/platform/EterBase/LogBox.h), because ScriptLib/PythonLauncher.cpp Traceback() reports every failed script line through LogBoxf after PyErr_Fetch has already cleared the exception — this is the only place a traceback survives.",
"test": "project/python_host_check.gd — system.py's ImportError reaches GDScript through it"
},
"LogFile": {
"status": "TODO"
},
"LogFilef": {
"status": "TODO"
},
"OpenLogFile": {
"status": "TODO"
},
"OpenConsoleWindow": {
"status": "TODO"
}
}
}