如何使用Nimpy将Nim代码编译为Python扩展模块?
用Nimpy实现Nim函数向Python的导出
1. 先安装Nimpy
用Nim的包管理器直接安装:
nimble install nimpy
2. 编写Nim代码(区分内部函数与暴露入口)
核心是用{.exportpy.}编译指令标记需要暴露给Python的函数,不带这个指令的函数会作为内部辅助函数,不会对外可见:
import nimpy # 内部辅助函数,仅Nim内部调用,不暴露给Python proc internalCalc(x: int): int = result = x * 3 - 1 # 暴露给Python的入口函数:处理整数序列 proc processIntList(input: seq[int]): seq[int] {.exportpy.} = result = newSeq[int](input.len) for i in 0..<input.len: result[i] = internalCalc(input[i]) # 暴露给Python的入口函数:处理字符串 proc wrapText(text: string): string {.exportpy.} = result = "[Processed] " & text.capitalizeAscii()
3. 编译为Python可导入的模块
根据操作系统选择对应的编译命令:
Linux/macOS
nim c --app:lib --out:nim_process.so --passC:-fPIC -d:release nim_process.nim
--app:lib:指定编译为共享库--passC:-fPIC:生成位置无关代码(Linux/macOS必需)-d:release:开启编译优化,提升运行效率--out:指定输出文件名,后缀用.so
Windows
nim c --app:lib --out:nim_process.pyd -d:release nim_process.nim
- Windows下Python扩展模块后缀用
.pyd,无需-fPIC参数
4. Python中调用模块
直接导入生成的文件即可,类型会自动映射(比如Python列表转Nim seq,字符串直接兼容):
import nim_process # 调用整数序列处理函数 raw_data = [2, 5, 7] processed_data = nim_process.processIntList(raw_data) print(processed_data) # 输出: [5, 14, 20] # 调用字符串处理函数 raw_text = "hello python" wrapped_text = nim_process.wrapText(raw_text) print(wrapped_text) # 输出: [Processed] Hello python
关键注意事项
- 类型兼容性:Nimpy自动处理基础类型(int、float、string、列表/seq、字典/Table等),自定义类型需要额外用
exportpy标记 - 无状态函数适配:你的无状态数据处理函数完全适配Nimpy,无需处理全局状态或资源回收问题
- 接口精简:仅给需要对外暴露的函数添加
{.exportpy.},内部辅助函数自然隐藏,保持接口简洁
内容的提问来源于stack exchange,提问作者rookie
相关产品推荐
相关产品推荐

