查看: 235|回复: 3

鸿蒙PC上自研Python IDE:N-API嵌入CPython实践

[复制链接]
发表于 2 小时前 | 显示全部楼层 |阅读模式
随着 HarmonyOS NEXT 逐步覆盖 PC 端,MateBook 等设备已经可以运行原生鸿蒙应用。但桌面端最核心的开发工具——IDE——在鸿蒙生态中仍然近乎空白。VS Code、PyCharm 这些依赖传统桌面栈的工具无法直接迁移,而教育领域常用的 Thonny 同样没有鸿蒙版本。本文以「鸿蟒工坊」为例,介绍如何在 HarmonyOS PC 上实现一个完整的 Python 集成开发环境,重点分享 ArkTS/ArkUI 前端、N-API 桥接、CPython 运行时嵌入以及 PTY 子进程执行的全链路技术实践。

「鸿蟒工坊」的目标很明确:将 Thonny 的极简双面板界面、真实 CPython 解释器、交互式 Shell 等核心能力移植到鸿蒙生态。项目命名取自鸿蒙的“鸿”、Python 的“蟒”和“工坊”的工具属性,整体工程基于 DevEco Studio 构建,使用 Stage 模型。

一、四层技术栈与数据流

整个应用分为四层:最上层是 ArkTS/ArkUI 实现的编辑器与 Shell 界面;其下是通过 N-API 建立的 Native 桥接层,负责与 C++ 侧通信;再往下是嵌入式 CPython 3.12 运行时;最底层则是 PTY 伪终端和系统内核驱动。

用户编辑代码后按下 F5 或点击运行按钮,数据会沿以下链路流动:Index.ets 中的 runCode() 读取 TextArea 内容,调用 thonnyBridge.writePty(code + "\n");N-API 通过线程安全函数将字符串写入 Native 线程;C++ 层使用 write() 将数据写入 PTY 主端;内核把数据转发给 PTY 从端,子进程中的 CPython REPL 读取并执行;输出经 stdout 回到 PTY 主端,read() 收到结果后通过回调传回 JS 层;ArkUI 的响应式状态变量 shellOutput 更新,Shell 面板即时显示。

二、ArkTS 前端与响应式刷新

主页面只有一个 Index.ets,采用经典 IDE 上下双栏布局。编辑器使用 TextArea,并绑定 TextAreaController 实现滚动控制;Shell 区域用 Scroll 包裹 Text,背景色设为 #1e1e1e 模拟终端。顶部菜单栏和工具栏提供新建、示例、运行、停止、清空 Shell 等操作,底部状态栏显示“Python 3.12 · embedded · Ln 3”以表明运行时状态。

关键的状态管理依赖 ArkTS 的 @State 装饰器。Native 线程通过 napi_call_threadsafe_function 调用 JS 回调,回调中修改 this.shellOutput,ArkUI 框架自动完成 diff 和局部刷新,无需手动操作 DOM。高频输出时,批量更新机制能有效减少渲染压力。

runCode() 的处理细节值得注意:它会先去除首尾空格,空内容直接返回,注释行也会被放行——因为 Python 的 shebang 和编码声明都以 # 开头。写入 PTY 后设置 800ms 超时重置 isRunning 状态,避免用户重复点击。loadExample() 则载入一段循环打印示例,同时清空 Shell,让用户聚焦在“写代码→运行→看结果”的核心体验上。

三、N-API 桥接:ArkTS 与 CPython 的通信管道

桥接层的核心是 thonny_bridge.cpp,约 300 行。模块注册使用 __attribute__((constructor)),在 .so 加载时自动执行 RegisterModule,调用 napi_module_register 将“thonnyBridge”注册到 N-API 运行时。通过 napi_define_properties 导出 init、writePty、readPty、resizePty、cleanup 五个方法,JS 端 import libthonny_bridge.so 后即可调用。

init() 方法接收 JS 回调,并创建线程安全函数,保证 Native 线程可以安全地调用 JS。随后创建 PTY:posix_openpt 打开主端,grantpt 设置从端权限,unlockpt 解锁。子进程 fork 后,在子进程中设置会话和终端控制,exec 启动 CPython REPL;父进程持有主端文件描述符,由专门线程负责 read() 并回调数据。

四、工程配置与构建要点

构建层面,build-profile.json5 中 compileSdkVersion 使用 '5.0.12(13)',对应 HarmonyOS NEXT API 12,runtimeType 设置为 “arkts” 以支持 ArkTS。module.json5 中声明了 ohos.permission.READ_WRITE_DOWNLOAD_DIRECTORY,原因是要将 python312.zip 解压到本地。实际部署时,更精细的做法是解压到应用沙箱目录 /data/storage/el2/base/files/,这样无需额外权限。

Native 构建由 CMakeLists.txt 管理,需要链接四类库:libace_napi.z.so(N-API 核心)、libhilog_ndk.z.so(日志)、libhonk_ttyd.so(第三方 PTY 包装库)和 libpython3.12.so(CPython 运行时)。最终产物 libthonny_bridge.so 与 libpython3.12.so、libhonk_ttyd.so 一起放在 entry/libs/arm64-v8a/ 目录。CPython 运行时约 18.5MB,会在一定程度上增大 HAP 包体积。

五、总结与参考价值

通过 N-API 将 CPython 嵌入鸿蒙应用,并在 PTY 上运行子进程实现交互式编程,这条路已经走通。它证明了鸿蒙 PC 原生应用可以承载复杂的开发工具,也为其他需要跨语言运行时或伪终端交互的场景提供了可复用的架构参考。对于有意投身鸿蒙 PC 应用生态的开发者,“鸿蟒工坊”是一个很有价值的起点。
回复

使用道具 举报

发表于 2 小时前 | 显示全部楼层

Re: 鸿蒙PC上自研Python IDE:N-API嵌入CPython实践

这个思路很有价值,鸿蒙PC生态确实缺一个趁手的Python IDE。用N-API把CPython嵌进ArkTS应用,再配合PTY做交互式Shell,等于把桌面端开发工具的核心链路在鸿蒙上重新打通了。 想请教几个实际使用中的问题: 1. 嵌入的CPython是完整版还是裁剪版?像pip、tkinter这些模块能正常用吗? 2. PTY模式下,如果Python程序里用了input()等待用户输入,当前界面是直接在Shell面板里输入,还是另有处理? 3. 高频输出时的批量更新机制,大概能撑住每秒多少行的刷新? 4. 有没有考虑后续做成开源项目?技术路线很清晰,如果能开放出来,应该会有不少开发者愿意一起完善。
回复 支持 反对

使用道具 举报

发表于 2 小时前 | 显示全部楼层

Re: 鸿蒙PC上自研Python IDE:N-API嵌入CPython实践

这个思路很扎实,从 ArkTS 前端到 N-API 桥接,再到 PTY 子进程执行,整条链路都讲得清清楚楚。尤其喜欢你对数据流的描述,从按下 F5 到 Shell 回显,每一步都有明确的落点,读起来很有画面感。 用 PTY 而不是普通管道来跑 CPython REPL,这点很关键——这样能保留交互式解释器的完整行为,比如 input() 提示、翻页输出、终端控制序列等,比简单抓 stdout 要可靠得多。另外把 CPython 嵌入进来而不是走外部进程,对鸿蒙这种沙箱环境也更务实。 一个好奇的小点:你提到第三方 PTY 包装库 libhonk_ttyd.so,这个库是自研还是社区方案?如果后续要开源或者扩展更多 IDE 功能(比如断点调试、变量监视),它和 CPython 的协作会不会成为瓶颈? 总之,这个项目填补了鸿蒙 PC 生态里很关键的一块空白,技术选型和分层也都很合理。期待后续能看到更多实践细节,比如性能调优、包体积优化,或者调试器的适配思路。
回复 支持 反对

使用道具 举报

发表于 2 小时前 | 显示全部楼层

Re: 鸿蒙PC上自研Python IDE:N-API嵌入CPython实践

这个技术实战太扎实了,把鸿蒙PC上最缺的一环补上了。特别是用N-API做桥接、PTY跑真实CPython解释器的思路,完全是桌面IDE该有的底层设计,不是套个WebView糊弄。 想请教下两个细节:一是高频输出时“批量更新机制”具体是怎么实现的,是攒一段再回调,还是ArkUI侧有节流?二是PTY子进程退出时,比如用户执行exit(),桥接层和前端状态是如何同步清理的? 另外,把Thonny那种极简双面板带进鸿蒙生态,确实很适合教学场景。希望后面能开源,让更多人在MateBook上写Python跑起来。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-7-31 12:41 , Processed in 0.021941 second(s), 17 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部