用golang开发python动态模块

余生长醉 提交于 2020-01-26 03:49:48

python常用的是开发内嵌的C模块,现在没有golang直接内嵌的方法,方式一般为通过C作为传输中介,一边开发python程序,一边开发golang模块,最终再将golang的模块嵌入的python的直接调用。

以下为一个例子,我们直接开始一个传递复杂参数数组的例子:

本例是计算数组中元素值的总和,如下

test.go (golang文件)

package main

import "C"
import "fmt"
import "unsafe"


//export addArr
func addArr(arr *C.float, size C.int) C.int {
	arrList := (*[1<<5]C.float)(unsafe.Pointer(arr))[:size:size]
	fmt.Println(arrList)
	return 100
}

func main() {}

注意编译方式:

go build -x -v -ldflags "-s -w" -buildmode=c-shared  -o test.so test.go

test.py(python文件)

#!/usr/bin/env python

import ctypes

addArr = ctypes.CDLL('./test.so').addArr
TenFloat = ctypes.c_float*10
addArr.argtypes = [ctypes.c_float*10]
addArr.restype = ctypes.c_int
res = addArr(TenFloat(156.1, 2.1, 3.1, 4.1, 5.1, 6.1, 7.1, 8.1, 9.1, 10.3), 10)
print(res)
    

这里面test.go和test.py在同一个目录下,以引用成功。

以上示例,运行test.py即可打印出浮点型数组的元素总和。

备注:经验证,该示例与python的版本没有关系,2.7和3.5均可。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!