Pyodide 在 Node.js 中使用 Socket:useNodeSockFS 实验性 API 完整指南
科学计算开发工具【免费下载链接】pyodidePyodide is a Python distribution for the browser and Node.js based on WebAssembly项目地址https://gitcode.com/gh_mirrors/py/pyodide点击查看免费下载导读本文讲解 Pyodide 在 Node.js 运行时中启用 socket 能力的官方方案pyodide.useNodeSockFS()。由于浏览器不提供底层 socket APIPyodide 默认在浏览器环境直接报错而在 Node.js 中你可以通过这一实验性 API 让 Python 的socket模块、asyncio网络操作以及 pymysql、pg8000、redis-py 等数据库驱动正常工作。读完本文你将掌握启用前提Node.js 版本与 JSPI 标志、完整的 JavaScript 与 Python 示例、底层实现原理NodeSockFS、WinterCG Sockets、syscall 挂钩以及已知限制。实验性警告该特性处于实验阶段未来版本可能变更或移除且仅在 Node.js 中可用浏览器不支持。1. 为什么浏览器里没有 socketNode.js 却能支持Pyodide 是构建在 WebAssembly 之上的 Python 发行版。浏览器的安全模型与 Web 平台没有提供标准的底层 socket API因此 Pyodide 默认不包含浏览器端 socket 实现——在浏览器中执行任何使用 socket 的代码都会抛出错误。Node.js 则不同它拥有完整的网络能力node:net、node:tls。Pyodide 因此在 Node.js 侧提供了一套实验性的 socket 实现JavaScript 层用NodeSockFS替换 Emscripten 默认的 SOCKFS底层传输基于WinterCG Sockets API见 src/js/fs/nodesockfs.ts 与 src/js/fs/wintercg-sockets.ts内核层通过 src/core/socket_syscalls.c 对connect、recvfrom、sendto、poll、shutdown、fcntl64等 syscall 进行包装把 NodeSock 文件描述符上的操作路由到异步实现Python 的asyncio事件循环webloop也通过_nodeSock桥接层直接调用 Node.js 的异步 socket 操作见 src/py/pyodide/webloop.py。2. 启用 socket 支持2.1 在 JavaScript 中调用 useNodeSockFS()关键要求必须在导入任何使用 socket 的 Python 模块之前调用await pyodide.useNodeSockFS()const pyodide await loadPyodide(); await pyodide.useNodeSockFS();该 API 的实现在 src/js/api.ts 中定义在非 Node.js 环境调用会直接抛出useNodeSockFS only works in Node错误它会初始化 NodeSockFS动态加载node:net/node:tls/node:stream把Module.SOCKFS.createSocket与Module.SOCKFS.pollAsync替换为 NodeSockFS 的实现并挂载一个伪文件系统节点详见 src/js/fs/nodesockfs.ts。提示useNodeSockFS接受一个可选参数options.connect可以传入自定义的 connect 函数需满足 WinterCG socket-api 接口该设计主要用于 Cloudflare Workers 等环境见 src/js/fs/nodesockfs.ts。2.2 JSPIJavaScript Promise Integration前提该特性依赖 JavaScript Promise IntegrationJSPI因为同步的 Python socket 调用在 WASM 栈上阻塞时需要通过WebAssembly.Suspending挂起栈、等待异步操作完成后恢复见 src/core/socket_syscalls.c 中对 GIL 与syscall_syncify()的说明。Node.js 版本是否需要额外参数Node.js 22–24需要显式开启node --experimental-wasm-jspiNode.js ≥ 25JSPI 默认启用无需额外参数# Node.js 22–24 node --experimental-wasm-jspi your_script.mjs2.3 命令行入口已内置支持仓库的 Node 命令行入口 src/templates/python_cli_entry.mjs 在启动 Python REPL 时会自动尝试调用py.useNodeSockFS()失败仅打印警告而不中断方便直接以node --experimental-wasm-jspi python_cli_entry.mjs的形式体验。2.4 环境变量与构建仓库通过 pyodide_env.sh 与 Makefile.envs 管理构建环境。若你从源码构建 Pyodide 用于 Node.js请确保构建时启用了 JSPI 相关的编译选项PYODIDE_JSPI相关开关运行环境则按上表确保 JSPI 可用。3. 在 Python 中直接使用 socket完成上述设置后Python 的socket模块即可像原生环境一样工作。文档给出的完整示例import socket # Create a socket s socket.socket(socket.AF_INET, socket.SOCK_STREAM) # Connect to a server s.connect((localhost, 8080)) # Send some data s.sendall(bHello, world) # Receive some data data s.recv(1024) print(Received, repr(data)) # Close the socket s.close()源码级佐证仓库的 src/tests/test_python_socket.py 使用selenium_nodesockfixture 对上述场景做了大量覆盖包括基本连接与数据收发test_socket_connect多次 send/recvtest_socket_multiple_send_recv大数据量传输test_socket_large_data_transfer、test_socket_large_recvgetpeername/getsockname/fileno等辅助方法连接被拒ECONNREFUSED、对端关闭后收发、部分读写、EOF、双重 close、shutdown等边界情况并发场景test_socket_asyncio_concurrent用asyncio.gather并发操作多个 socketsocket.makefile()基于行的 I/O。这些测试证明该实现不仅支持最基础的 TCP 收发还覆盖了错误码、非阻塞语义与超时等细节。4. 配合数据库驱动使用许多数据库驱动依赖 socket 连接数据库服务器。启用 socket 支持后在 Node.js 上运行的 Pyodide 即可使用这些驱动。文档给出的 pymysql 示例import pymysql # Connect to the database connection pymysql.connect(hostlocalhost, useruser, passwordpassword, databasetest) # Create a cursor cursor connection.cursor() # Execute a query cursor.execute(SELECT * FROM my_table) # Fetch the results results cursor.fetchall() print(results) # Close the connection connection.close()仓库的 src/tests/test_database_driver.py 提供了更丰富的验证矩阵均使用selenium_nodesockfixtureMySQLpymysql、aiomysql并含 TLS 场景test_mysql_pymysql_tlsPostgreSQLpg8000Redisredis-pyORMSQLAlchemy同时对接 MySQL 与 PostgreSQL。这表明只要目标驱动走标准 TCP socketAF_INET / SOCK_STREAM就可以在 Pyodide Node.js 中直接跑通真实数据库业务。5. 底层实现原理5.1 NodeSockFS替换 Emscripten 的 SOCKFSNodeSockFS 是 Node.js 原生 socket 文件系统以 WinterCG Sockets API 为传输层在两个上下文中被使用见 src/js/fs/nodesockfs.ts替换 socket 系统调用JSPI 路径同步的 Pythonsocket.connect/recv/send通过WebAssembly.Suspending挂起 WASM 栈等待异步操作完成后再恢复asyncio webloop 路径异步事件循环的 socket 函数sock_connect、sock_recv、sock_sendall通过API._nodeSock桥接直接调用 NodeSockFS见 src/py/pyodide/webloop.py。每个 socket 在内部对应一个NodeSock结构包含 WinterCG socket、ReadableStream reader、WritableStream writer、接收缓冲区recvBuffer、EOF 状态以及阻塞模式下的dataAvailable可解析 Promise 等字段。5.2 支持的地址族与类型重要限制在 createSocket 中做了严格校验仅支持 AF_INETIPv4其它地址族抛EAFNOSUPPORT仅支持 SOCK_STREAMTCPSOCK_DGRAMUDP抛EOPNOTSUPP其它类型抛EINVAL协议仅接受IPPROTO_TCP服务器端操作未实现bind、listen、accept全部抛EOPNOTSUPP见 src/js/fs/nodesockfs.ts。也就是说当前只能作为客户端发起连接不能作为服务器监听端口。5.3 syscall 挂钩与 JSPI 同步src/core/socket_syscalls.c 用__wrap_系列函数重写__syscall_connect、__syscall_recvfrom、__syscall_sendto、__syscall_poll、__syscall_shutdown、__syscall_fcntl64每个_maybe_*_async辅助函数先检查 fd 是否属于 NodeSock存在sock_ops.connectAsync/recvmsgAsync等非 NodeSock fd 返回 null 并回落到 Emscripten 原始实现保证兼容性对 NodeSock fd把异步操作封装成 Promise交给syscall_syncify()完成保存状态 → 挂起 → 等待 Promise → 恢复状态的完整周期CPython 的socketmodule.c在进入 syscall 前已释放 GILsendto在跨异步边界前先把数据从HEAPU8拷贝出来避免 WASM 内存增长导致指针失效setsockopt被重写为总是返回成功避免 Emscripten 桩实现返回ENOPROTOOPT而破坏依赖该调用的应用。5.4 WinterCG Sockets API 封装wintercg-sockets.ts 提供了connect()与Socket类通过node:net/node:tls建立连接再借助stream.Duplex.toWeb转成 Web 标准的ReadableStream/WritableStream同时暴露opened/closedPromise 与可选的startTls()升级能力。它采用动态import()加载 Node 模块因此该文件在浏览器构建中也能被安全导入而不产生顶层 Node 依赖。5.5 非阻塞与 poll 语义NodeSockFS 实现了与 Emscripten SOCKFS 风格一致的poll/pollAsync可读POLLRDNORM | POLLIN缓冲区有数据或到达 EOF可写POLLOUT已连接且有 writer挂起POLLHUP底层传输已关闭非阻塞 recv 在无数据时返回-EAGAIN超时通过Promise.race([waitForData(sock), sleep(timeout)])实现见 src/js/fs/nodesockfs.ts。这保证 CPython 基于poll() 超时的 socket 超时机制在 Node.js 下正常工作。6. 已知限制与注意事项限制项说明浏览器不可用仅 Node.js浏览器调用useNodeSockFS直接抛错webloop 中的 socket 方法也会抛NotImplementedError仅 IPv4 TCP 客户端无 UDP、无 IPv6、无服务器端 bind/listen/acceptJSPI 依赖Node.js 22–24 必须加--experimental-wasm-jspi≥ 25 默认开启实验性官方明确可能变更或移除NodeSockFS 依赖 Emscripten 内部结构源码中留有 FIXME见 src/js/fs/nodesockfs.ts调用时机必须在导入任何使用 socket 的 Python 模块之前调用useNodeSockFS()TLS底层 WinterCGSocketOptions.secureTransport支持off/on/starttls三态数据库 TLS 场景如 pymysql TLS 测试已覆盖7. 快速上手清单使用 Node.js ≥ 25或 Node.js 22–24 时以node --experimental-wasm-jspi启动加载 Pyodide 后、导入 socket 相关 Python 模块前执行await pyodide.useNodeSockFS()在 Python 中正常import socket编写客户端代码AF_INET SOCK_STREAM或接入 pymysql / pg8000 / redis-py 等数据库驱动如需深入验证行为参考 src/tests/test_python_socket.py 与 src/tests/test_database_driver.py 中的测试用例。关联文档docs/usage/socket.md核心实现src/js/fs/nodesockfs.ts、src/core/socket_syscalls.cAPI 定义src/js/api.ts。赞分享科学计算开发工具【免费下载链接】pyodidePyodide is a Python distribution for the browser and Node.js based on WebAssembly项目地址https://gitcode.com/gh_mirrors/py/pyodide点击查看免费下载相关推荐3分钟快速上手番茄小说下载器完整使用指南3分钟快速上手番茄小说下载器完整使用指南 你是否经常遇到网络小说想读却无法离线保存的烦恼番茄小说下载器正是为你解决这一痛点的终极工具这是一款基于Rust开科学计算开发工具如何在Node.js中使用Redis图数据库完整实战指南如何在Node.js中使用Redis图数据库完整实战指南 Redis图数据库RedisGraph是Redis Stack中强大的图数据库模块它基于属性图后端数据库客户端缓存终极QuickDraw Dataset指南零基础掌握Python与Node.js API使用技巧终极QuickDraw Dataset指南零基础掌握Python与Node.js API使用技巧 QuickDraw Dataset是一个包含5000万幅手绘数据集上一篇wgpu粒子系统大规模粒子效果渲染下一篇如何永久保存微信聊天记录3步掌握WeChatMsg数据备份终极指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

S905L3/L3B盒子免拆刷机与当贝桌面深度优化指南

S905L3/L3B盒子免拆刷机与当贝桌面深度优化指南

1. 项目概述:为什么S905L3/L3B盒子值得花时间折腾?晶晨S905L3和S905L3B这两款芯片,是2022—2024年国内中低端安卓电视盒子市场里出货量最大的“隐形主力”。它们不是旗舰,但胜在成本低、功耗小、兼容稳——尤其适合做家庭影音中枢…

2026/9/22 11:12:49 阅读更多 →
VS2010 断点错位?让 Codex 走 TaoToken 对照 0D0A 排查

VS2010 断点错位?让 Codex 走 TaoToken 对照 0D0A 排查

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/22 11:12:49 阅读更多 →
把 Trae IDE 的 Base URL 改到 TaoToken,user_rules.md 照旧对 @Builder 生效

把 Trae IDE 的 Base URL 改到 TaoToken,user_rules.md 照旧对 @Builder 生效

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/23 13:04:44 阅读更多 →

最新新闻

软件需求四层建模:从业务目标到可测契约的实战方法

软件需求四层建模:从业务目标到可测契约的实战方法

简介:本资源是一份面向高校计算机专业本科生及软件工程初学者的《软件需求分析》教学课件,系统讲解需求工程核心流程与关键概念,助力学习者夯实软件开发前期基础。课件以PPT格式呈现,共1个文件,大小3.03MB,…

2026/9/23 20:26:44 阅读更多 →
抖音运营手册思维导图拆解:从账号定位到数据复盘的可执行清单

抖音运营手册思维导图拆解:从账号定位到数据复盘的可执行清单

简介:这份《抖音官方运营手册:思维导图》面向抖音创作者、账号运营者及电商从业者,系统梳理了平台官方学习路径与运营指导,帮助读者快速建立从入门到进阶的运营知识框架。资源为单个PDF文件,压缩包约400KB,…

2026/9/23 20:26:44 阅读更多 →
2024产品经理实战知识地图:从需求分析到迭代的完整工作法

2024产品经理实战知识地图:从需求分析到迭代的完整工作法

简介:这是一份面向产品经理岗位的实战知识地图,围绕岗位认知、产品生命周期、需求分析、商业分析等核心模块展开,系统梳理了SMART目标设定、马斯洛需求层次、KANO模型、5WHY追问、PRD框架等关键方法,并为原型、流程图绘制列举了Ax…

2026/9/23 20:26:44 阅读更多 →
3个底层原理搞懂预防脱发完整示例

3个底层原理搞懂预防脱发完整示例

3个底层原理搞懂预防脱发完整示例 看了一堆教程还是不会写项目?别慌,这就像你背了所有菜谱却做不出一道菜,缺的是把“预防脱发”这个抽象概念拆解成可执行代码的 完整示例…

2026/9/23 20:26:44 阅读更多 →
InstructBLIP 指令微调视觉语言模型实战指南:基于 LAVIS 的通用多模态理解与生成

InstructBLIP 指令微调视觉语言模型实战指南:基于 LAVIS 的通用多模态理解与生成

InstructBLIP 指令微调视觉语言模型实战指南:基于 LAVIS 的通用多模态理解与生成 【免费下载链接】LAVIS LAVIS - A One-stop Library for Language-Vision Intelligence 项目地址: https://gitcode.com/gh_mirrors/la/LAVIS InstructBLIP 是 LAVIS 仓库中官…

2026/9/23 20:26:44 阅读更多 →
Dopamine 连续控制域实验运行器 ContinuousRunner 完全指南:JAX/Flax Agent 的训练调度、参数配置与源码剖析

Dopamine 连续控制域实验运行器 ContinuousRunner 完全指南:JAX/Flax Agent 的训练调度、参数配置与源码剖析

机器学习深度学习 【免费下载链接】dopamine Dopamine is a research framework for fast prototyping of reinforcement learning algorithms. 项目地址: https://gitcode.com/gh_mirrors/do/dopamine 点击查看 免费下载 导读 dopamine.continuous_domains.run_…

2026/9/23 20:25:44 阅读更多 →

日新闻

3招搞定手机怎么下载微信面试难题实战项目解析

3招搞定手机怎么下载微信面试难题实战项目解析

3招搞定手机怎么下载微信面试难题实战项目解析 面试被问“手机怎么下载微信”背后的原理,90%的人答不上来。别笑,这看似弱智的问题,实则是考察你对移动应用分发机制、安全校验及网络协议理解的试金石。我带过不少校招新人,他们背了八股文,却连一个A…

2026/9/23 0:00:23 阅读更多 →
2k显示屏性能优化踩坑:版本升级后API全变了,这份源码解析救了我

2k显示屏性能优化踩坑:版本升级后API全变了,这份源码解析救了我

2k显示屏性能优化踩坑:版本升级后API全变了,这份源码解析救了我 刚把开发环境的显示器从1080P换到2K,跑老项目直接报错,版本升级后 API…

2026/9/23 0:01:25 阅读更多 →
3步搞定美眉图实战项目,告别官方文档抓不住重点

3步搞定美眉图实战项目,告别官方文档抓不住重点

3步搞定美眉图实战项目,告别官方文档抓不住重点 官方文档翻了三遍还是云里雾里?别急,美眉图在实战项目中常被用来做数据可视化,但它的原理比你想的简单。今天咱们直接上手,用一个完整的小项目把美眉图跑通,不再死磕那些冗长的理论说明。…

2026/9/23 0:01:25 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/23 4:55:02 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/23 4:49:06 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/23 9:53:41 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/23 9:53:40 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/23 9:53:40 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/23 9:53:40 阅读更多 →