1 回答
TA贡献1799条经验 获得超6个赞
零输出
这个功能:
int PyArg_ParseTuple_S(PyObject * args, char* a) {
return PyArg_ParseTuple(args, "s", &a);
}
将只设置本地的副本a,并不会使其返回到调用函数,因为按值传递的字符串指针(复制),所以PyArg_ParseTuple只设置副本。
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以下命令对其进行转换:
// C string to Go string
func C.GoString(*C.char) string
(来自https://golang.org/cmd/cgo/)
例如:
str := C.GoString(a)
fmt.Println(str)
分段故障。
我不熟悉 python 模块开发,但我可以假设,错误发生了,因为 python 方法应该返回一个有效的PyObject*或NULL. 但是你的代码没有做这些。的返回值startVM没有设置,也不是默认为nil,python接受这个非nil的指针作为一个有效的对象并解引用它,这会导致分段错误。
指定返回类型startVM可能会有所帮助:
//export startVM
func startVM(self, args *C.PyObject) *C.PyObject {
// ...some code...
return nil
}
- 1 回答
- 0 关注
- 190 浏览
添加回答
举报