当前位置: 首页 > article >正文

Python调用go语言编译的库

要在 Python 中调用用 Go 语言编写的库,可以使用 Go 语言的 cgo 特性将 Go 代码编译成共享库(如 .so 文件),然后在 Python 中通过 ctypes 或 cffi 模块加载和调用这个共享库。

新建main.go文件,使用go语言编写如下代码并编译为.so库

package main

import "C"

//export Add
func Add(a, b int) int {
	return a + b
}

func main() {}

编译指令:

cd 到该文件所在目录

go build -o mylib.so -buildmode=c-shared main.go

mylib.so可以自己随意定义名字,后缀名使用.so即可

执行编译指令后,将生成两个文件:mylib.so(共享库)和 mylib.h(头文件)

Note: 想要编译成功,这里有两个注意事项:

  • 要导入 “C” 库,C库不导入也无法生成mylib.h文件,最终的.so也无法使用

在 Go 语言中,使用 cgo 特性来编写可以与 C 语言互操作的代码时,需要导入 "C" 包。导入 "C" 包的主要原因是为了使用 cgo 提供的功能,包括:

  1. 导出 Go 函数:通过 export 注释将 Go 函数导出为 C 函数,使其可以在共享库中被调用。
  2. 调用 C 代码:在 Go 代码中嵌入 C 代码,或者调用 C 函数和使用 C 数据类型。

导入 "C" 包是为了启用 cgo 特性,使得可以在 Go 代码中嵌入 C 代码、调用 C 函数、使用 C 数据类型,以及将 Go 函数导出为 C 函数。通过这种方式,可以编写可以与 C 语言互操作的 Go 代码,并将其编译为共享库,以便在其他语言(如 Python)中调用。

  •  要有export语句-->注意使用该语句时 //后面不能有空格,所则导出后没有mylib.h文件,mylib.so文件也不能使用

//export Add

export 注释将其导出为共享库中的函数。


  • 最终在Python中使用的文件是mylib.so 文件,mylib.h不需要,编写如下Python代码,调用我们上面编译好的共享库
import ctypes


if __name__ == '__main__':
    mylib = ctypes.CDLL("./mylib.so")

    # 定义函数原型
    mylib.Add.argtypes = (ctypes.c_int, ctypes.c_int)
    mylib.Add.restype = ctypes.c_int

    # 调用函数
    result = mylib.Add(5, 55)
    print(f"Result of Add(5, 55): {result}")
  • 输出结果:


http://www.kler.cn/a/507564.html

相关文章:

  • 哪些新兴技术对智能驾驶汽车影响最大?
  • 【力扣Hot 100】普通数组1
  • Linux查看日志命令
  • 【大数据】机器学习-----模型的评估方法
  • AIGC时代:如何快速搞定Spring Boot+Vue全栈开发
  • DHCP详解和部署
  • Math Reference Notes: 矩阵基础
  • Android adb 调试,不在手机上点击信任 “允许usb调试” 即可连接的方式(手机需root)
  • 浅谈云计算20 | OpenStack管理模块(下)
  • CV与NLP经典大模型解读
  • RAG 切块Chunk技术总结与自定义分块实现思路
  • Node.js path.join
  • UE控件学习
  • 你会选择java还是node做后台管理
  • 青少年CTF练习平台 文章管理系统(sqlmap使用os-shell找flag)PHP
  • 选择saas 还是源码主要考虑
  • 网络编程:基于TCP/UDP实现客户端和服务端通信(C语言实现简单易懂)
  • 如何在若依框架中自定义添加一个页面
  • 相机拍照参数:WB、FF、S、ISO、EV、焦距
  • 08、如何预防SQL注入
  • 《机器学习》——PCA降维
  • 1.快慢指针-力扣-283-移动零
  • 软件测试入门—功能需求分析:以一个旅游管理系统为例
  • LeetCode 1426 题:数元素解题全解析
  • 【机器学习实战入门项目】MNIST数字分类机器学习项目
  • 用C++实现一个基于模板的观察者设计模式