Py_SetProgramName()已废弃,如何设置Python可执行文件名称?
解决Python 3.11+中Py_SetProgramName()的废弃警告问题
问题背景
在Python 3.11及以上版本中,使用官方嵌入开发示例代码里的Py_SetProgramName()函数会触发废弃警告。尽管该函数在Python 3.12文档中仍被提及为推荐操作,但实际编译时会抛出警告,需要修改代码消除该提示。
原示例代码:
#define PY_SSIZE_T_CLEAN #include <Python.h> int main(int argc, char *argv[]) { wchar_t *program = Py_DecodeLocale(argv[0], NULL); if (program == NULL) { fprintf(stderr, "Fatal error: cannot decode argv[0]\n"); exit(1); } Py_SetProgramName(program); /* optional but recommended */ Py_Initialize(); PyRun_SimpleString("from time import time,ctime\n" "print('Today is', ctime(time()))\n"); if (Py_FinalizeEx() < 0) { exit(120); } PyMem_RawFree(program); return 0; }
触发的编译警告:
test01.c:12:5: warning: 'Py_SetProgramName' is deprecated [-Wdeprecated-declarations] Py_SetProgramName(program); /* optional but recommended */ ^ /opt/python/3.11/include/python3.11/pylifecycle.h:37:1: note: 'Py_SetProgramName' has been explicitly marked deprecated here Py_DEPRECATED(3.11) PyAPI_FUNC(void) Py_SetProgramName(const wchar_t *); ^ /opt/python/3.11/include/python3.11/pyport.h:336:54: note: expanded from macro 'Py_DEPRECATED' #define Py_DEPRECATED(VERSION_UNUSED) __attribute__((__deprecated__)) ^ 1 warning generated.
解决方案
从Python 3.11开始,Py_SetProgramName()被官方废弃,替代方案是使用**PyConfig结构体**完成程序名称配置,这是符合新版本规范的现代化方式,既能保留原功能,又能彻底消除警告。
修改后的代码如下:
#define PY_SSIZE_T_CLEAN #include <Python.h> int main(int argc, char *argv[]) { wchar_t *program = Py_DecodeLocale(argv[0], NULL); if (program == NULL) { fprintf(stderr, "Fatal error: cannot decode argv[0]\n"); exit(1); } // 初始化PyConfig并设置程序名称 PyConfig config; PyConfig_InitPythonConfig(&config); config.program_name = program; // 通过配置初始化Python解释器 if (Py_InitializeFromConfig(&config) < 0) { PyMem_RawFree(program); exit(1); } PyRun_SimpleString("from time import time,ctime\n" "print('Today is', ctime(time()))\n"); if (Py_FinalizeEx() < 0) { exit(120); } PyMem_RawFree(program); return 0; }
关键修改说明
- 调用
PyConfig_InitPythonConfig(&config)获取默认配置模板 - 将解码后的程序名称赋值给
config.program_name字段 - 使用
Py_InitializeFromConfig(&config)替代原Py_Initialize(),通过配置结构体启动解释器
修改后,sys.executable仍能正常显示正确的可执行文件名称,同时完全消除废弃警告,符合Python 3.11+的官方开发规范。
内容的提问来源于stack exchange,提问作者Anthon
相关产品推荐
相关产品推荐

