使用 Python 的 C API 创建基本的 PyTupleObject
Creating a basic PyTupleObject using Python's 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 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;
}
崩溃
Process finished with exit code -1073741819 (0xC0000005)
但是到目前为止我尝试过的其他所有操作也是如此。任何想法我做错了什么?并不是说我只是想 运行 作为 C++ 程序,因为我只是想在添加 swig 类型映射之前对代码进行测试。
评论者@asynts 是正确的,因为您需要通过 Py_Initialize if you want to interact with Python objects (you are, in fact, embedding Python). There are a subset of functions 从 API 初始化解释器,可以在不初始化解释器的情况下安全地调用它,但会创建 Python 对象不属于这个子集。
Py_BuildValue 可能“有效”(例如,不使用这些特定参数创建段错误),但如果您在未初始化解释器的情况下尝试对它执行任何操作,它会在代码的其他地方引起问题.
您似乎在尝试扩展 Python 而不是嵌入它,但您嵌入它是为了测试扩展代码。您可能需要参考 official documentation for extending Python with C/C++ 来指导您完成此过程。
我在使用 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 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;
}
崩溃
Process finished with exit code -1073741819 (0xC0000005)
但是到目前为止我尝试过的其他所有操作也是如此。任何想法我做错了什么?并不是说我只是想 运行 作为 C++ 程序,因为我只是想在添加 swig 类型映射之前对代码进行测试。
评论者@asynts 是正确的,因为您需要通过 Py_Initialize if you want to interact with Python objects (you are, in fact, embedding Python). There are a subset of functions 从 API 初始化解释器,可以在不初始化解释器的情况下安全地调用它,但会创建 Python 对象不属于这个子集。
Py_BuildValue 可能“有效”(例如,不使用这些特定参数创建段错误),但如果您在未初始化解释器的情况下尝试对它执行任何操作,它会在代码的其他地方引起问题.
您似乎在尝试扩展 Python 而不是嵌入它,但您嵌入它是为了测试扩展代码。您可能需要参考 official documentation for extending Python with C/C++ 来指导您完成此过程。