使用 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++ 来指导您完成此过程。