处理 Python 3.11 弃用的 PySys_SetPath 和 Py_SetProgramName

在C++调用matplotlibcpp.h画图时报错,使用的python版本是3.11.3版本。

处理 Python 3.11 弃用的 PySys_SetPath 和 Py_SetProgramName_第1张图片

解决方案:不重要的话,注释该行代码即可。

Python 3.11 弃用 PySys_SetPath 和 Py_SetProgramName。这
PyConfig API 取代了这些功能和其他功能。此提交使用
PyConfig API 提供(希望)等效的功能,同时
还保留对旧版本 Python 的支持,即那些
Python 3.8 之前。

Fedora Rawhide 中提供了 Python 3.11 的测试版。两个都
Fedora 35和Fedora 36使用Python 3.10,而Fedora 34仍然使用
Python 3.9。我已经在 Fedora 34、Fedora 36 和
生皮,尽管由于以下原因无法对生皮进行完整测试
一个内核错误。既然如此,我决定启用较新的
PyConfig API 通过针对 0x030a0000 测试 PY_VERSION_HEX。这
对应于 Python 3.10。

我们可以尝试在 Python 3.8 版本中使用新的 API,
但我不愿意这样做,因为可能与 PyConfig 相关
早期版本中的错误已被修复。最近的linux
发行版应包括对 Python 3.10 的支持。这应该是
足以测试新的 Python 初始化代码
GDB。

有关 PyConfig API 的信息以及背后的动机
弃用旧界面可以在这些链接中找到:

https://github.com/python/cpython/issues/88279
https://peps.python.org/pep-0587/
https://docs.python.org/3.11/c-api/init_config.html

gdb/python/python-internal.h | 5 +++++
gdb/python/python.c | 43 +++++++++++++++++++++++++++++++++++++++±-
更改了 2 个文件,插入了 46 个(+),删除了 2 个(-)

diff --git a/gdb/python/python-internal.hb/gdb/python/python-internal.h
索引 5ff9989af83…3dae4e13a4c 100644
—a/gdb/python/python-internal.h
+++ b/gdb/python/python-internal.h
@@ -177,6 +177,10 @@ gdb_PySys_GetObject (const char *name)

#define PySys_GetObject gdb_PySys_GetObject

+/* PySys_SetPath 在 Python 3.11 中已弃用。禁用已弃用的

  • Python 3.10 及更高版本的代码。*/
    +#if PY_VERSION_HEX < 0x030a0000

/* PySys_SetPath 的 ‘path’ 参数缺少 ‘const’ 限定符
Python 3.6 之前。因此,我们将其包装在一个函数中以避免错误
当使用 -Werror 编译时。*/
@@ -190,6 +194,7 @@ gdb_PySys_SetPath (const GDB_PYSYS_SETPATH_CHAR *路径)
}

#define PySys_SetPath gdb_PySys_SetPath
+#endif

/* 包装 PyGetSetDef 以允许使用字符串方便地构造
文字。不幸的是,PyGetSetDef 的“名称”和“文档”成员
diff --git a/gdb/python/python.cb/gdb/python/python.c
索引 8f526bba84e…ce42c59f1ae 100644
— a/gdb/python/python.c
+++ b/gdb/python/python.c
@@ -2001,16 +2001,44 @@ do_start_initialization ()
}
setlocale(LC_ALL, oldloc.c_str());

  • /* Py_SetProgramName 在 Python 3.11 中已弃用。使用PyConfig
  • Python 3.10 及更新版本的机制。/
    +#if PY_VERSION_HEX < 0x030a0000
    /
    请注意,Py_SetProgramName 需要传递给它的字符串
    在程序执行期间保持活动状态,因此
    调用后它没有被释放。*/
    Py_SetProgramName (progname_copy);
  • /* 将 _gdb 定义为内置模块。*/
    PyImport_AppendInittab(“_gdb”, init__gdb_module);
    -#万一
  • Py_Initialize();
    +#else

  • PyStatus 状态;

  • PyConfig 配置;

  • PyConfig_InitPythonConfig (&配置);

  • status = PyConfig_SetString (&config, &config.program_name, progname_copy);

  • config.write_bytecode = !Py_DontWriteBytecodeFlag;

  • config.use_environment = !python_ignore_environment;

  • if (!PyStatus_Exception (status))

  • 状态 = PyConfig_Read (&config);

  • /* 将 _gdb 定义为内置模块。*/

  • if (PyImport_AppendInittab (“_gdb”, init__gdb_module) == -1)

  • 返回假;

  • if (!PyStatus_Exception (status))

  • 状态 = Py_InitializeFromConfig (&config);

  • PyConfig_Clear (&配置);

  • if (PyStatus_Exception (status))

  • 返回假;
    +#endif
    +#else
    Py_Initialize();
    +#endif

#如果 PY_VERSION_HEX < 0x03090000
/* PyEval_InitThreads 在 Python 3.9 中被弃用,并将
在 Python 3.11 中被删除。在 Python 3.7 之前,这个调用是
@@ -2317,12 +2345,23 @@ do_initialize (const struct extension_language_defn *extlang)

sys_path = PySys_GetObject (“路径”);

  • /* PySys_SetPath 在 Python 3.11 中被弃用。禁用此功能
  • Python 3.10 及更新版本的弃用代码。另请注意,这
  • ifdef 通过以下方式消除了 sys.path 的潜在初始化
  • PySys_SetPath。我(kevinb)对 PEP 587 的理解表明
  • 由于 module_search_paths 是不必要的
  • 在任何 PyConfig 之后初始化为一个空列表
  • 初始化函数。如果确实证明某种
  • 初始化仍然需要,应该添加到
  • do_start_initialize() 中基于 PyConfig 的初始化。/
    +#if PY_VERSION_HEX < 0x030a0000
    /
    如果 sys.path 尚未定义,请先定义它。*/
    如果 (!(sys_path && PyList_Check (sys_path)))
    {
    PySys_SetPath(L"");
    sys_path = PySys_GetObject (“路径”);
    }
    +#endif
    如果(sys_path && PyList_Check(sys_path))
    {
    gdbpy_ref<> pythondir(PyUnicode_FromString(gdb_pythondir.c_str()));

    2.36.1

你可能感兴趣的:(C/C++学习,python3.11)