python 调用golang 注意事项

news2024/11/18 23:38:59

1.调用编译后的动态库文件,报头文件错误

原因:

不同平台下编译的add.so 不能通用,Windows下可以运行的so文件,linux下就不能运行,需要重新编译linux的so文件;

该报错可能就是跨平台使用动态库文件了,需要重新编译。

2.编译的动态库文件在调用时找不到函数方法

原因:
//add.go
package main

import "C"

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

//export Addstr
func Addstr(a, b *C.char) *C.char {
	merge := C.GoString(a) + C.GoString(b)
	return C.CString(merge)
}

// go build -buildmode=c-shared -o add.so add.go
func main() {
}

如上:在外部调用的两个函数前的注释://export Add 和 //export Addstr 不可少,而且注释符‘//’和‘export’之间不能有空格。在编译成.so文件的时候,编译器会寻找这个注释。为了能正常编译,我们也必须导入C这个包。

特別注意 //和export 中间不能有空格;该注释不可忽略

3.python和golang之间的参数传递,需要使用C的数据类型进行中间变化

只有int可以不需要转换,直接在go和C直接互相调用
对于不同的类型,需要使用cgo中定义的方法转换,具体可以参考golang-cgo文档。

比如string需要用C.char来传递,C.GoString(s)可以将C.char类型转换为string,反之C.CString可以把string类型转为 *C.char

Python是利用ctypes来跟so模块进行交互,其中存在着一个代码的翻译过程,包括数据类型的翻译,如果需要传参获取接收返回值,需要在golang中将参数按照下表对应,定义成C语言的数据类型。
python,ctypes , c 对应类型参考 python 官方文档

在这里插入图片描述

4.python在入参字符串时还需要使用utf-8进行编码,装换为byte类型

# -*- coding:utf-8 -*-
# @Time    : 2020/9/29
# @Author  : hllyzms
import ctypes

lib = ctypes.cdll.LoadLibrary('./add.so')

result = lib.Add(2020, 1)
print(result)

add = lib.Addstr  #调用go模块
# 显式声明参数和返回的期望类型
add.argtypes = [ctypes.c_char_p, ctypes.c_char_p]
add.restype = ctypes.c_char_p
str1 = add("abc".encode("utf-8"),'efg'.encode("utf-8"))
print(str1,type(str1))

再次说明:

go中的*C.char 对应 ctypes 中的c_char_p 对应Python中的bytes object or None
Python与Go之间的参数传递, 处理非INT型时需要都转为对应的C类型
ctypes需要显式地声明DLL函数的参数和返回期望的数据类型
注意在Python3中字符串bytes和string的区别
Go模块需要//export 声明外部可调用
Go处理C的类型是需要显式转换

编译:

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

// 这条命令指定了编译模式为c-shared,编译完成以后,当前文件夹下面会生成一个add.so文件。这就是我们需要用 Python 载入的文件了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/517186.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

yolov5爬坑小作文

第一坑 做完训练集,配置要yaml文件后,笔者启动了训练命令 python train.py --data 我的yaml位置 --batch-size 我的每次进行一次反向传播之前需要前向计算的图片张数 --device 我的GPU编号 之后报错 OSError: [WinError 1455] 页面文件太小,无法完成…

检测数据类型

//typeof() 对于基本数据类型没问题,遇到引用数据类型不管用 console.log(typeof 666) //number console.log(typeof [1,2,3]) //object //instanceof() 只能判断引用数据类型,不能判断基本数据类型 console.log( [] instanceof Array) //true …

Acunetix 15.6 (Linux, Windows) - Web 应用程序安全测试

Acunetix 15.6 (Linux, Windows) - Web 应用程序安全测试 请访问原文链接:https://sysin.org/blog/acunetix-15/,查看最新版。原创作品,转载请保留出处。 作者主页:sysin.org Acunetix 漏洞扫描器,管理您的网络安全。…

电脑待机怎么设置?分享4个宝藏方法!

案例:电脑待机怎么设置 【有时候我使用电脑时可能因为各种事而被打断,但是不是很想让电脑关机,请问大家电脑待机时间应该怎么设置呀?】 有时候我们在使用电脑时可能需要做别的一些事,这时我们的电脑会进入待机状态。…

裸奔时代,隐私何处寻?

随着互联网的普及,人工智能时代的大幕初启,数据作为人工智能的重要支撑,数据之争成为“兵家必争之地”,随之而来的就是,各种花式手段“收割”个人信息,用户隐私暴露程度越来越高,隐私保护早已成…

空间权重矩阵与相关性检验(Stata)

空间权重矩阵与相关性检验(Stata) 文章目录 空间权重矩阵与相关性检验(Stata)[toc]1 空间相关性检验1.1 全局空间相关性检验1.2 局部空间自相关检验1.3 散点图 2 权重矩阵2.1 截断距离权重矩阵2.2 反距离权重矩阵 1 空间相关性检验 cd "D:\Allcode\Stata\Spatial-Econome…

如何在知行之桥EDI系统中修改ICN?

EDI电子数据交换中的ICN是什么? 在EDI术语中,ICN# 的全称为Interchange Control Number,是文件的发送方分配的唯一标识符,可以识别每一个文件。 我们常见的符合X12和EDIFACT报文标准的文件中,ICN#分别指的是ISA13和U…

泼辣修图app下载2024最新版修图滤镜

泼辣修图专业版是一款强大的专业修图软件,拥有上百款调色工具还有丰富的图层素材, 更有智能的人像修饰面板,具备物体识别的智能蒙板,高效的滤镜管理系统和强大的文字工具,支持批量处理。一切围绕摄影,无论是…

如何在 Windows 10 上安装 WSL

第 1 步,启用 WSL 不管您想要使用哪个版本的 WSL,都首先需要启用它。为此,请以管理员身份打开 PowerShell 工具并运行以下命令。小心不要在命令中输入错误或遗漏任何字符: dism.exe /online /enable-feature /featurename:Micro…

DolphinDB 流数据状态函数插件介绍

1. 引言 量化金融的研究和实盘中,越来越多的机构需要根据高频的行情数据(L1/L2以及逐笔委托数据)来计算量价因子,每只股票的每一条新数据的注入都会更新该只股票的所有因子值。这些因子通常是有状态的:不仅与当前的多…

精选博客系列|VMware发布下一代Workspace ONE SaaS平台,性能提升了10倍!

我们很高兴地宣布下一代 Workspace ONE SaaS 平台面世了!日前公布的 Workspace ONE 架构的根本变化已经包含了我们最近的一些进展,例如自由式编排器,而且将成为未来 VMware 终端用户计算(EUC)创新的基石。 现代化的架…

【python】python闭包的详细解读(傻瓜式教学)

👉博__主👈:米码收割机 👉技__能👈:C/Python语言 👉公众号👈:测试开发自动化 👉专__注👈:专注主流机器人、人工智能等相关领域的开发、…

第八届SkyHackathon环境配置及问答指南

第八届SkyHackathon环境配置提问说明 本届Hackathon以传送带上的箱子检测为目标, 参赛的队伍需要完成: 利用Omniverse Replicator合成训练数据集利用合成的数据集, 训练目标检测模型将检测模型部署在组委会提供的Jetson Xavier NX节点上 其中上述第一和第二步需要参赛的同学…

前端——JS

1.JS的学习内容 JavaScript的组成包含ECMAScript、DOM、BOM。 2.JS的特点 JS是运行在浏览器上的一种脚本语言 【1】Java和JS的区别&#xff1a; 【2】HTML和CSS和JS这三者的关系 3.JS的引入方式 3.1JS的引入方式1 <!DOCTYPE html> <html lang"en"> &…

飞书文档和Cnfluence之间的区别是什么

PingCode 知识库、Confluence 等知识库工具和腾讯文档、WPS、飞书文档到底有什么区别&#xff1f;这是企业团队在找文档管理工具最常见的问题。这两种工具虽然都可以用于组织和共享知识&#xff0c;但它们在功能、使用场景和用户群体方面有很大的区别。那么&#xff0c;它们到底…

亚马逊云科技推出Matter PKI合规指导手册

亚马逊云科技推出Matter公钥基础设施&#xff08;Public Key Infrastructure,PKI&#xff09;合规指导手册&#xff0c;帮助客户使用Amazon Private Certificate Authority&#xff08;Amazon Private CA&#xff09;证书服务构建符合Matter要求的PKI证书体系&#xff0c;加快客…

R语言 | 数据汇总与简单图表制作

目录 一、准备工作 1.1 下载MASS扩展包与crabs对象 1.2 准备与调整系统内建state相关的对象 1.3 准备mtcars对象 二、了解数据的唯一值 三、基础统计知识与R语言 3.1 数据的集中趋势 3.1.1 认识统计学名词——平均数 3.1.2 认识统计学名词——中位数 3.1.3 认识统计学…

Adobe Photoshop 2022版 功能介绍及使用技巧

目录 版本介绍&#xff1a; 使用技巧&#xff1a; 截图展示&#xff1a; 分享 版本介绍&#xff1a; Adobe Photoshop 2022是Adobe公司的一款专业的图像处理软件&#xff0c;它提供了强大的图像处理功能&#xff0c;从色彩调整&#xff0c;图层处理到高级合成等功能。新版…

webhub123 硬件工程师学习和交流、问答各类网站集合

硬件不像软件开源共享的多&#xff0c;硬件的开发和学习相对不自由&#xff0c;能收集到资料有限。为了帮硬件开发工程找到更多大门&#xff0c;我们整理了一些学习、交流的优质网站&#xff0c;收录到 webhub123 硬件工程师学习和交流、问答各类网站集合http://​www.webhub12…

有没有中国版本的ChatGPT?

ChatGPT是一个基于人工智能的聊天机器人&#xff0c;它可以与用户进行自然语言交互。ChatGPT使用了最新的自然语言处理技术&#xff0c;包括深度学习和神经网络&#xff0c;以便更好地理解用户的意图和回答用户的问题。 ChatGPT可以回答各种问题&#xff0c;包括但不限于常见问…