简单 Python/C API 测试中的 Nullptr 错误

问题描述

我在尝试使用 Python/C++ API 时遇到 nullptr 错误。这些错误中的大多数都来自相当长/复杂的代码,其中有人试图引用一个指针而不先将其设置为某些内容,但是我能够仅用几行代码来复制我的行为,我不知道发生了什么.

这是 MWE:

#include <Python.h>
#include <iostream>

int main()
{
    std::cout << "Hello World!\n\n";
    PyObject *pyl;
    pyl = PyLong_FromLong(3);
    std::cout << PyLong_AsLong(pyl) << std::endl;
}

我正在 Visual Studio Community 2017 中将其编译为 C++ 控制台应用程序。我的 Python 版本是 3.8.5。我正在使用发布模式和 x64 模式下的调试进行构建(我的 Python 安装是 x64)。我在配置属性中完成了以下操作:

  1. 将包含python.lib和python38.lib的目录添加到VC++目录→库目录;
  2. 将包含 Python.h 的目录添加到 C/C++ → General → Additional Include Directories;
  3. 将包含python.dll和python38.dll的目录添加到系统PATH变量中。

错误出现在最后一行,并说:

Exception thrown: read access violation.
obj->ob_type was nullptr.

调用堆栈如下所示:

enter image description here

如果我尝试不同的东西,例如我分配了 pyl = PyList_New(3);,我得到一个稍微不同的错误Exception thrown: read access violation. _PyRuntime.gc.generation0 was nullptr.

我不得不想象我的 Python 安装可能搞砸了,或者我遗漏了一些非常明显的东西,但我在其他任何地方都没有看到过这样的错误,所以你们的任何想法都将不胜感激。

注意:Python 文档说要在代码中包含定义 #define PY_SSIZE_T_CLEAN。这不会改变我所看到的。

进一步编辑:在 Hello World 打印后直接添加Py_Initialize()调用给了我这个打印输出

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)