You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 14:13:14