1 回答

TA貢獻(xiàn)1799條經(jīng)驗 獲得超6個贊
零輸出
這個功能:
int PyArg_ParseTuple_S(PyObject * args, char* a) {
return PyArg_ParseTuple(args, "s", &a);
}
將只設(shè)置本地的副本a,并不會使其返回到調(diào)用函數(shù),因為按值傳遞的字符串指針(復(fù)制),所以PyArg_ParseTuple只設(shè)置副本。
var a *C.char
C.PyArg_ParseTuple_S(args, a)
// Here `a` is not set, so it keeps its default value: nil.
您可以通過將指針傳遞給字符串而不是字符串本身來解決此問題:
// C
int PyArg_ParseTuple_S(PyObject * args, char** a) {
return PyArg_ParseTuple(args, "s", a);
}
// Go
var a *C.char
if C.PyArg_ParseTuple_S(args, &a) == 0 {
//return nil
}
正確印刷
fmt.Println(a)將打印 持有的地址a,而不是它指向的字符串。Go 有自己的字符串類型,不適用于 C 字符串。
如果要正確打印文本,則必須使用C.GoString以下命令對其進(jìn)行轉(zhuǎn)換:
// C string to Go string
func C.GoString(*C.char) string
(來自https://golang.org/cmd/cgo/)
例如:
str := C.GoString(a)
fmt.Println(str)
分段故障。
我不熟悉 python 模塊開發(fā),但我可以假設(shè),錯誤發(fā)生了,因為 python 方法應(yīng)該返回一個有效的PyObject*或NULL. 但是你的代碼沒有做這些。的返回值startVM沒有設(shè)置,也不是默認(rèn)為nil,python接受這個非nil的指針作為一個有效的對象并解引用它,這會導(dǎo)致分段錯誤。
指定返回類型startVM可能會有所幫助:
//export startVM
func startVM(self, args *C.PyObject) *C.PyObject {
// ...some code...
return nil
}
- 1 回答
- 0 關(guān)注
- 207 瀏覽
添加回答
舉報