将 [] 字符串从 Go 转换为 python 列表

问题描述 投票:0回答:1

我正在尝试将 []string 从 golang 返回到我的 python 程序中的 list。我成功地从 stackoverflow 的一些参考文献中将 go slice 转换为 c 数组。

参考

但我不确定如何转换回Python列表。

如有任何指点,我们将不胜感激。

谢谢。

这是我的代码示例。

// example.go

package main

import "C"

import (
    "unsafe"
)

//export Example
func Example() **C.char {
    // len of slice may be dynamic
    data := []string {
        "A",
        "B",
        "C",
    }

    cArray := C.malloc(C.size_t(len(data)) * C.size_t(unsafe.Sizeof(uintptr(0))))

    a := (*[1<<30 - 1]*C.char)(cArray)

    for i, value := range data {
        a[i] = C.CString(value)
    }

    return (**C.char)(cArray)
}

func main() {}
# example.py
from ctypes import *

lib = cdll.LoadLibrary('./example.so')

lib.Example.argtypes = None
lib.Example.restype = POINTER(c_char_p)
ret_value = lib.Example()

mylist = [value for value in ret_value.contents]
print(mylist)
python-3.x go cgo
1个回答
0
投票

您可以使用 MetaFFI

做到这一点

假设这个 SplitStrings.go

func SplitStringByComma(input string) []string {
    return strings.Split(input, ",")
}

使用MetaFFI编译器编译为共享对象(.so或.dll):

metaffi -c --idl SplitStrings.go -g

这将创建 SplitStrings_MetaFFIGuest.[so/.dll]

接下来,在Python中,加载共享对象并加载函数:

import metaffi # get metaffi-api package from PIP

# load Go runtime plugin
runtime = metaffi.metaffi_runtime.MetaFFIRuntime('go')
runtime.load_runtime_plugin()

# load module
split_module = runtime.load_module('SplitStrings_MetaFFIGuest.so')

# load function

# define return type, you don't have to predefine the dimensions, but it can improve performance.
ret_type = [metaffi.metaffi_types.metaffi_type_info(metaffi.metaffi_types.MetaFFITypes.metaffi_string8_array_type, dims=1)]

# define parameters type
params_type = [metaffi.metaffi_types.metaffi_type_info(metaffi.metaffi_types.MetaFFITypes.metaffi_string8_type)]
        
# load the function
split_strings_by_comma = split_module.load_entity('callable=SplitStringByComma', params_type, ret_type)

# use it
res = split_strings_by_comma('one,two,three')

免责声明:我是MetaFFI的作者

© www.soinside.com 2019 - 2024. All rights reserved.