首页 > 编程语言 >尝试用GO给python写共享库

尝试用GO给python写共享库

时间:2025-01-16 18:21:14浏览次数:1  
标签:lib mylib python char Go Add ctypes GO 共享

背景

就突发奇想,Go的效率相对来说高一些,那我们可不可以用Go来给python写关键处理库呢

查了下,还真可以实现,只是障碍比较多,而且使用起来也比较麻烦,但是也还是能实现的

解决

用 Go 编写 Python 库可以通过 Cgo 或 C共享库 的方式实现。
Go 代码可以被编译为 C 兼容的共享库(.so 或 .dll),然后通过 Python 的 ctypes 或 cffi 模块调用。

go代码

package main

import "C"
import "fmt"

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

//export Greet
func Greet(name *C.char) *C.char {
    msg := fmt.Sprintf("Hello, %s!", C.GoString(name))
    return C.CString(msg)
}

func main() {} // 必须有一个 main 函数

注意点:

  • 一定要使用 //export 将函数导出,否则,是无法被编译到库中的,双斜杠后面一定不能有空格
  • 因为 Go 的字符串类型(string)与 C 的字符串类型不直接兼容,所以在 Go 和 C 之间传递字符串时,需要使用 C 的字符串类型(*C.char)这一点很关键
  • 必须有一个 main 函数

编译

使用以下命令将 Go 代码编译为 C 共享库:

Linux/MacOS:

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

生成 mylib.so 和 mylib.h 文件。

Windows:

go build -o mylib.dll -buildmode=c-shared .

生成 mylib.dll 和 mylib.h 文件。

python中使用

使用 Python 的 ctypes 模块加载共享库并调用函数。

import ctypes
import os

# 根据不同操作系统加载对应的共享库
if os.name == "nt":  # Windows
    lib = ctypes.cdll.LoadLibrary("mylib.dll")
else:  # Linux/MacOS
    lib = ctypes.cdll.LoadLibrary("./mylib.so")

# 定义函数签名 这里需要跟go中的对应
lib.Add.argtypes = (ctypes.c_int, ctypes.c_int)
lib.Add.restype = ctypes.c_int

# 因为是指针,所以是c_char_p
lib.Greet.argtypes = (ctypes.c_char_p,)
lib.Greet.restype = ctypes.c_char_p


# 调用 Go 函数
result = lib.Add(3, 4)
print(f"Add(3, 4) = {result}")  # 输出: Add(3, 4) = 7

name = "World".encode("utf-8")
greeting = lib.Greet(name).decode("utf-8")
print(greeting)  # 输出: Hello, World!

总结

总的来说,还是能够顺利达到目的
但是实际写下来,发现其实障碍挺多
尤其这个 类型 ,很多都是无法相通的,不相通就没法编译成功

所以,玩玩还行,真掏出来用,还得下点功夫

标签:lib,mylib,python,char,Go,Add,ctypes,GO,共享
From: https://www.cnblogs.com/guangdelw/p/18675556

相关文章

  • Python时间序列分析:使用TSFresh进行自动化特征提取
    TSFresh(基于可扩展假设检验的时间序列特征提取)是一个专门用于时间序列数据特征自动提取的框架。该框架提取的特征可直接应用于分类、回归和异常检测等机器学习任务。TSFresh通过自动化特征工程流程,显著提升了时间序列分析的效率。自动化特征提取过程涉及处理数百个统计特征,包括均......
  • SQL中的。和python中的。的区别。让你彻底明白 。
    SELECTsale_order.name,SUM(sale_order_line.price_total)astotal_amountFROMsale_orderJOINsale_order_lineASsale_order_lineONsale_order.id=sale_order_line.order_idGROUPBYsale_order.id像上面的语句中,sale_order.name为什么这个可以.name能像python那......
  • 计算机毕业设计Springboot基于VUE的非物质文化遗产分享管理系统 基于Springboot与VUE
    计算机毕业设计Springboot基于VUE的非物质文化遗产分享管理系统w5i528n6(配套有源码程序mysql数据库论文)本套源码可以先看具体功能演示视频领取,文末有联xi可分享随着数字化时代的到来,非物质文化遗产的保护与传承面临着新的机遇与挑战。传统的保护方式已难以满足现代社会的......
  • 面向对象分析与设计Python版 控制器与多态原则
    文章目录一、控制器原则二、多态原则一、控制器原则控制器原则名称:控制器Controller应用场景:确定谁负责接收、处理和分发系统的输入事件。解决方案:系统输入事件处理的职责分给控制器对象一个控制器对象实现业务系统的所有输入事件处理和业务逻辑分发,这一类控制器......
  • 开发人员学习书籍推荐(C#、Python方向)
    作为一名开发人员,持续学习和提升自己的技术水平是至关重要的。如今,技术不断更新换代,新的开发框架、语言和工具层出不穷。对于刚入行的开发者或希望深入某一领域的工程师来说,选对书籍是学习的捷径之一。本篇文章将推荐一些经典的书籍,涵盖了C#、数据库、前端开发等多个领域,帮助你......
  • 【深度学习教程】Python 如何用 LSTM 做情感分析?小白也能上手!
    【深度学习教程】如何用LSTM做情感分析?小白也能上手!Hello大家好,今天我们来聊一个超热门的话题——LSTM网络在情感分析中的应用!想象一下,通过深度学习,你的代码可以读懂人类情绪,知道“我爱你”和“我讨厌你”的区别,是不是很酷?今天这篇文章,我会手把手教你从零开始,用Python和Ke......
  • Python生成成绩报告单:从理论到实践
    在教育信息化日益普及的今天,自动化生成和处理学生成绩报告单已成为学校和教育机构的一项重要任务。Python作为一种功能强大且易于学习的编程语言,非常适合用于这种数据处理和报告生成任务。本文将详细介绍如何使用Python生成成绩报告单,包括理论概述和完整的代码示例。一、理论概述......
  • 【python入门】2.安装搭建python环境
    1.安装python解析器1.1为什么要装python解析器?python属于高级语言,计算机并不认识我们需要用解析器,将python文件,经过python解析器翻译成,计算机能够识别的机器语言1.2如何安装下载地址:PythonReleasePython3.7.9|Python.org检验安装完成在cmd中输入python,若出......
  • 开发一个篮球共享计分器小程序
    序言作为一名篮球爱好者的程序员,在使用目前市面篮球计分器时,总觉得用的不顺手,市面基本都是单机模式,广告很多,也不便于核对和多人协同记录。因此,我决定自己设计并开发一款篮球共享计分器小程序,实现多人协同记录赛事,提供多种方便快捷的计分方式和统计数据效果。上效果图: ......
  • python毕设高铁订票系统程序+论文
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、选题背景关于高铁订票系统的研究,现有研究多集中于传统订票系统的整体框架和功能实现,以大型订票平台的综合业务逻辑为主,专门针对python实现高铁......