C, 파이톤에서 Go를 불러오세요.

5760 단어 Gotech
Go는 동적 라이브러리 생성 기능이 있어 다른 프로그래밍 언어로 Go의 라이브러리를 호출하려는 경우 유용하다.
이 글은 이 기능의 기본적인 사용 방법을 설명할 것이다.

Go


Source Code


main.go
package main

import "C"
import "fmt"

//export foo
func foo(name *C.char) *C.char {
	nameString := C.GoString(name)
	result := fmt.Sprintf("Hello, %s!", nameString)
	return C.CString(result)
}

func main() {}
프로그램 라이브러리의 주체가 되는 코드.
C 패키지에 대한 import을 통해 cgo의 다양한 함수 형식을 호출할 수 있습니다.export 공유 라이브러리에서 디렉터리에 표시된 export 함수를 사용할 수 있습니다.
매개 변수와 되돌아오는 값을 *C.char 로 설정합니다. 이것은 string 공유 라이브러리에서 사용되는 GoString 유형이기 때문입니다.
Gostring은 struct { const char *p; ptrdiff_t n; } 형식으로 헤더 파일을 읽을 수 없는 프로그래밍 언어 (예: Python) 는 _fields_: List[Tuple] 구성원이 있는 클래스를 argtypes 로 지정하거나 rettype 등 약간의 처리 번거로움으로 인해 중단됩니다.
앞으로 시간이 있을 때 부기된 일에 대해 설명할 수도 있습니다.

Build


go build -buildmode=c-shared -o main.so main.go
교차 번역의 경우CGO_ENABLED0가 되기 때문에 환경 변수를 전달해야 한다.

C


Source Code


main.c
#include <stdio.h>
#include "main.h"

int main() {
	char* result = foo("mopeneko");
	puts(result);
}
라이브러리를 구축할 때include에서 생성된 main.h 를 통해 Go가 생성한 형식이나 export 함수를 호출할 수 있습니다.string를 사용하는 경우 main.h에 기술된 구조 정의에 따라 액세스해야 합니다.

Build


cc -o main main.c main.so
방금 구축된 main.so를 컴파일러에 전달하여 컴파일합니다.

Execute


$ ./main
Hello, mopeneko!

Python


Source Code


main.py
from ctypes import CDLL, c_char_p

lib = CDLL("./main.so")
foo = lib.foo
foo.restype = c_char_p
print(foo(b"mopeneko").decode("utf-8"))
restype는 기본값ctypes.c_int이므로 반환값에 따라 지정해야 합니다.
매개 변수와 반환값char*은bytes형과 대체적으로 같기 때문에 b"" 또는str.decode()을 사용하여 적당한 유형 전환을 해야 한다.
위에서 말한 바와 같이 string가 매개 변수나 되돌아오는 값이라면 argtypes 또는 rettype에서 클래스를 지정해야 한다.

Execute


$ python main.py
Hello, mopeneko!

좋은 웹페이지 즐겨찾기