2016-11-19 7 views
1

私はPython用のGoライブラリをラッピングしています。私はNoneを返しできるようにする必要がありますが、それはコンパイル時にそれを見つけていない。ここで なぜPy_Noneを見つけるのビルドしないのですか?

/* 
#cgo pkg-config: python3 
#define Py_LIMITED_API 
#include <Python.h> 
*/ 
import "C" 

//export Nothing 
func Nothing(self, args *C.PyObject) (status *C.PyObject) { 
    C.Py_IncRef(C.Py_None) 
    return C.Py_None 
} 

が、私はそれがすべてを見つけることができますどのように理解していないよ go build

go build -buildmode=c-shared -o mymodule.so 
# example.com/mywrapper 
/tmp/go-build293667616/example.com/mywrapper/_obj/_cgo_main.o:(.data.rel+0x0): undefined reference to `Py_None' 
collect2: error: ld returned 1 exit status 

の出力です他のPy *関数と型(PyArgs_ParseTuplePyLong_FromLongはうまく動作しますが)Py_Noneが見つかりません。 Pythonライブラリは明らかに読み込まれています。何が起きてる?

+3

Py_None'は、マクロである 'のようになります。https://github.com/python/cpython/blob/ 321fd597f9dff757185bcfeb5fc39536746e06ab /インクルード/オブジェクト.ht#L908 –

+0

うわー、私は決してそれを推測していないでしょう。あなたはどこから戻ってきたのですか?確かにこれは誰かがぶつかったものです。 –

+0

私はcgoについて何も知らないけど、おそらく '_Py_NoneStruct'のアドレスを参照することができます。これは' Py_None'が展開するものです。 –

答えて

1

Ismail Badawiからのコメントのおかげで、答えは、Noneを返すCで関数を書くことです。これは、Py_Noneがマクロであり、Goが見ることができないために必要です。

none.c

#define Py_LIMITED_API 
#include <Python.h> 

PyObject *IncrNone() { 
     Py_RETURN_NONE; 
} 

mymodule.go

/* 
#cgo pkg-config: python3 
#define Py_LIMITED_API 
#include <Python.h> 

PyObject *IncrNone(); 
*/ 
import "C" 

//export Nothing 
func Nothing(self, args *C.PyObject) (status *C.PyObject) { 
     return C.IncrNone() 
} 
関連する問題