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

python调用golang中函数方法

一、原因说明:由于simhash方法有多种实现方式,现python中simhash方法与golang中的不一样,需要两者代码生成结果保持一致,故采用python中的代码调用golang编译的so文件来实现。

环境配置:①Windows10系统要有gcc环境,否则go build编译so文件不会成功。,可以下载mingw-w64进行配置,下载地址:mingw-w64

Windows10系统环境%PATH%配置增加以下路径:

如果是VSCode编译器,需要重启一下IDE,才能找到gcc命令:gcc --version

注意:有的Windows10通过MinGW Installer安装的32位gcc版本,编译会报错。如下:

即错误提示:"cc1.exe: sorry, unimplemented: 64-bit mode not compiled in"

把MinGW安装换成mingw-w64安装即可。

推荐参考地址:windows gcc 遇到的问题解决

二、代码编写案例可参考以下两个

方式一:go代码中未引用开源库代码,可参考该链接:python调用golang代码  

方式二:go代码中引用开源库代码(例如 import "github.com/xxx"),可参考该链接:go编译so库让python引用,编译后没有.h文件的问题

三、重点说明

重点说明一下方式二,go代码中涉及第三方依赖包引用,需要对调用的函数加上export注释。如下所示:

//export SimhashText
func SimhashText(text *C.char) *C.char {
	tempText := C.GoString(text)
	sh := Simhash(NewWordFeatureSet([]byte(tempText)))
	ret := strconv.FormatUint(sh, 10)
	return C.CString(ret)
}

如果提示报错(例如 C.GoStrings、C.Cstring()),可点击"regenerate cgo definitions" 生成C代码

注意:上面的"//export SimhashText" 不是注释,类似java中的注解,该声明会把go的函数映射到python的函数调用。没有export,编译不能生成.h文件,python也就无法调用该函数

编译命令参考如下:

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

编译成功后的列表如下图,会出现一个so文件和一个h头文件。(注意:只有一个so文件是编译失败,不会有提示信息,需要重新检查代码

四、Python调用so文件方式

将so文件与python代码放在同一目录下,示例代码如下:

import ctypes


text = "license that can be found in the LICENSE file."

simhashText = ctypes.cdll.LoadLibrary('./simhash.so').SimhashText
simhashText.argtypes = [ctypes.c_char_p]
simhashText.restype = ctypes.c_char_p
str1 = simhashText(text.encode("utf-8"))
print(str1)
# 5193707119813816010

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

相关文章:

  • 高级java每日一道面试题-2024年11月06日-JVM篇-什么是 Class 文件? Class 文件主要的信息结构有哪些?
  • 408笔记合集
  • GPT-5 要来了:抢先了解其创新突破
  • 火车车厢重排问题,C++详解
  • 穿越数据迷宫:C++哈希表的奇幻旅程
  • 飞牛云fnOS本地部署WordPress个人网站并一键发布公网远程访问
  • 面试高频知识点:2线程 2.1.6线程之间如何通信
  • 06 MP之自动填充+SQL执行的语句和速度分析
  • FreeRTOS中的任务上下文切换时间
  • 【OrangePi Zero2的系统移植】OrangePi Zero2 SDK说明
  • 2024年GPT如何发展?
  • 接口错误码以及对应的含义
  • Python进阶--爬取美女图片壁纸(基于回车桌面网的爬虫程序)
  • PostgreSql与Postgis安装
  • PS一键磨皮插件Delicious Retouch for mac中文 支持PS2024
  • 排序算法---快速排序
  • 如何正确理解和获取S参数
  • 【C语言】案例:输出n位水仙花数
  • 吉他学习:识谱,认识节奏,视唱节奏,节拍器的使用
  • Python爬虫http基本原理#2
  • 使用 Python、Elasticsearch 和 Kibana 分析波士顿凯尔特人队
  • 【Spring源码解读!底层原理高级进阶】【上】探寻Spring内部:BeanFactory和ApplicationContext实现原理揭秘✨
  • 自学Python第二十二天- Django框架(六) django的实用插件:cron、APScheduler
  • 【原创 附源码】Flutter海外登录--Tiktok登录最详细流程
  • react中的diff算法
  • SAP-PS-001-006问题预算占用与订单实际金额不一致