Python 调用 Go动态链接库

Python 调用Go 动态链接库

1.编写Go 动态链接库
1.1 安装g++ windows 安装mingw64,配置环境变量
1.2 编写代码
package main

import "C"

func main() {
    //这里写测试导出函数的代码
	//str:=Listmethod(C.CString("345"))
	//s:=C.GoString(str)
	//fmt.Println(s)
}
//导出函数必须加上下面的注释 export 函数名
//export Listmethod 
func Listmethod(s * C.char) * C.char {
	str:=C.GoString(s)
	str=str+"1234"
	return C.CString(str)
}

在导出的函数中输入输出为字符串类型,需要将其转成 *C.char类型才行

Go string -> *C.char 使用 C.CString(string)

*C.char -> Go string 使用 C.GoString(*C.char)

只需要转换输入参数和返回值类型即可,无需修改函数内部中间变量的类型,整数类型可以不用修改

编写完代码后,可以在main函数中进行测试,调试一下看看有没有什么问题,调试完后将测试代码注释掉。

1.3 生成 动态链接库
go build -buildmode=c-shared -o 动态链接库名.dll或者.so go代码文件名称.go

windows系统导出的就是.dll linux 导出就写.so

在这里插入图片描述

2.编写Python调用代码
import ctypes
lib = ctypes.cdll.LoadLibrary('./string.dll')# 加载动态链接库
addr = ctypes.cast(lib.Listmethod, ctypes.c_void_p).value # 获取地址
functype = ctypes.CFUNCTYPE(ctypes.c_char_p, ctypes.c_char_p) # 创建CFUNCTYPE对象指定返回值类型,输入参数类型
func = functype(addr) # 传入地址 形成可调用函数
print(func("GGG".encode("U8")).decode("U8"))  # 调用函数 当参数是字符串是要编码成 bytes类型

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值