使用Python创建基本PyTupleObject';SCAPI
我很难使用Python C api创建PyTupleObject使用Python创建基本PyTupleObject';SCAPI,python,c++,python-c-api,Python,C++,Python C Api,我很难使用Python C api创建PyTupleObject #include "Python.h" int main() { int err; Py_ssize_t size = 2; PyObject *the_tuple = PyTuple_New(size); // this line crashes the program if (!the_tuple) std::cerr << "the
#include "Python.h"
int main() {
int err;
Py_ssize_t size = 2;
PyObject *the_tuple = PyTuple_New(size); // this line crashes the program
if (!the_tuple)
std::cerr << "the tuple is null" << std::endl;
err = PyTuple_SetItem(the_tuple, (Py_ssize_t) 0, PyLong_FromLong((long) 5.7));
if (err < 0) {
std::cerr << "first set item failed" << std::endl;
}
err = PyTuple_SetItem(the_tuple, (Py_ssize_t) 1, PyLong_FromLong((long) 5.7));
if (err < 0) {
std::cerr << "second set item failed" << std::endl;
}
return 0;
}
但到目前为止我试过的其他方法也是如此。知道我做错了什么吗?不是我只是试图运行一个C++程序,因为我只是在添加一个SWIG类型映射之前尝试对代码进行测试。 < P> @ Acsits是正确的,因为如果想与Python对象进行交互(实际上,你是嵌入Python),则需要初始化解释器。API中有一个不需要初始化解释器就可以安全调用的方法,但是创建Python对象不属于这个子集 Py_BuildValue可能“起作用”(如中所示,不使用这些特定参数创建segfault),但如果在未初始化解释器的情况下尝试使用它,则会在代码的其他地方引起问题
看起来您试图扩展Python,而不是嵌入它,但是您嵌入它是为了测试扩展代码。您可能需要参考以指导您完成此过程。我对Python的C API一无所知,但我假设您必须以某种方式初始化运行时,快速搜索显示
Py\u initialize
:是的,我看到了。然而,我认为这只有在实际嵌入Python时才有必要。我只是尝试得到C++中创建的元组,因为我会立即把它传递给SWIG,这会起到很大的提升作用。另外,使用函数PyObject*obj=Py_BuildValue(“i”,1,2)从main开始工作,没有调用Py_Initialize-只有当我尝试创建一个元组时,我才会得到一个segfault。API必须提供某种垃圾收集或引用计数机制,因为可以将这些对象传递给python,这当然需要一些初始化。
Process finished with exit code -1073741819 (0xC0000005)