在C++调用matplotlibcpp.h画图时报错,使用的python版本是3.11.3版本。
解决方案:不重要的话,注释该行代码即可。
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