You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 03:07:26