python調用golang生成的so庫

版本:go version go1.8.3 linux/amd64python

go語言生成c語言的so庫在網上已經不少資料了,因爲項目須要python和go結合,而python又能夠調用c語言的so庫,因此嘗試了一下linux

在GOPATH目錄的src下新建一個test的文件夾,裏面新建一個test.go函數

test.go代碼ui

package main
import "C"

//export Hello
func Hello() string {
    return "Hello"
}

//export Test
func Test(){
    println("test");
}

func main() {
}

使用命令生成libhello.so和libhello.hrest

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

因爲Hello函數返回的是一個GoString,而GoString在libhello.h下的聲明是code

typedef struct { const char *p; GoInt n; } GoString;

可見是一個結構體,因此使用python調用的時候須要使用ctypes庫轉換一下 字符串

from ctypes import *  
  
class StructPointer(Structure):  
    _fields_ = [("p", c_char_p), ("n", c_longlong)]  
  
if __name__ == "__main__":  
    lib = cdll.LoadLibrary("./libhello.so")  
    lib.Hello.restype = StructPointer
    str = lib.Hello()  
    print(str.n)
    #str.n是GoString返回字符的長度,沒有截取的話後面會跟着一大串字符串
    print(str.p[:str.n])
    lib.Test()

輸出結果 string

5
Hello
test
相關文章
相關標籤/搜索