From 5306a2bad61a1be2f2b679ec588032c8feccfe6b Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Thu, 1 Jun 2023 09:35:50 +0200 Subject: [PATCH] gh-105145: Deprecate Py_GetPath() function Deprecate old Python initialization functions: * PySys_ResetWarnOptions() * Py_GetExecPrefix() * Py_GetPath() * Py_GetPrefix() * Py_GetProgramFullPath() * Py_GetProgramName() * Py_GetPythonHome() _tkinter uses sys.executable instead of Py_GetProgramName(). --- Doc/c-api/init.rst | 18 ++++++++++++++++++ Doc/c-api/sys.rst | 3 +++ Doc/whatsnew/3.13.rst | 12 ++++++++++++ Include/pylifecycle.h | 12 ++++++------ Include/sysmodule.h | 2 +- ...3-06-01-09-40-30.gh-issue-105145.WOOE-w.rst | 11 +++++++++++ Modules/_tkinter.c | 5 ++--- 7 files changed, 53 insertions(+), 10 deletions(-) create mode 100644 Misc/NEWS.d/next/C API/2023-06-01-09-40-30.gh-issue-105145.WOOE-w.rst diff --git a/Doc/c-api/init.rst b/Doc/c-api/init.rst index f3690ebfab28276..bad549dc9042a75 100644 --- a/Doc/c-api/init.rst +++ b/Doc/c-api/init.rst @@ -430,6 +430,9 @@ Process-wide parameters .. versionchanged:: 3.10 It now returns ``NULL`` if called before :c:func:`Py_Initialize`. + .. deprecated-removed:: 3.13 3.15 + Get :c:member:`PyConfig.program_name` or :data:`sys.executable` instead. + .. c:function:: wchar_t* Py_GetPrefix() @@ -449,6 +452,9 @@ Process-wide parameters .. versionchanged:: 3.10 It now returns ``NULL`` if called before :c:func:`Py_Initialize`. + .. deprecated-removed:: 3.13 3.15 + Get :c:member:`PyConfig.prefix` or :data:`sys.prefix` instead. + .. c:function:: wchar_t* Py_GetExecPrefix() @@ -490,6 +496,9 @@ Process-wide parameters .. versionchanged:: 3.10 It now returns ``NULL`` if called before :c:func:`Py_Initialize`. + .. deprecated-removed:: 3.13 3.15 + Get :c:member:`PyConfig.exec_prefix` or :data:`sys.exec_prefix` instead. + .. c:function:: wchar_t* Py_GetProgramFullPath() @@ -508,6 +517,9 @@ Process-wide parameters .. versionchanged:: 3.10 It now returns ``NULL`` if called before :c:func:`Py_Initialize`. + .. deprecated-removed:: 3.13 3.15 + Get :c:member:`PyConfig.executable` or :data:`sys.executable` instead. + .. c:function:: wchar_t* Py_GetPath() @@ -533,6 +545,9 @@ Process-wide parameters .. versionchanged:: 3.10 It now returns ``NULL`` if called before :c:func:`Py_Initialize`. + .. deprecated-removed:: 3.13 3.15 + Get :c:member:`PyConfig.module_search_paths` or :data:`sys.path` instead. + .. c:function:: const char* Py_GetVersion() @@ -616,6 +631,9 @@ Process-wide parameters .. versionchanged:: 3.10 It now returns ``NULL`` if called before :c:func:`Py_Initialize`. + .. deprecated-removed:: 3.13 3.15 + Get :c:member:`PyConfig.home` instead. + .. _threads: diff --git a/Doc/c-api/sys.rst b/Doc/c-api/sys.rst index ad6005b7c7a878b..cbcb2a30ce8f950 100644 --- a/Doc/c-api/sys.rst +++ b/Doc/c-api/sys.rst @@ -237,6 +237,9 @@ accessible to C code. They all work with the current interpreter thread's Reset :data:`sys.warnoptions` to an empty list. This function may be called prior to :c:func:`Py_Initialize`. + .. deprecated-removed:: 3.13 3.15 + Clear :c:member:`PyConfig.warnoptions` or :data:`sys.warnoptions` instead. + .. c:function:: void PySys_WriteStdout(const char *format, ...) Write the output string described by *format* to :data:`sys.stdout`. No diff --git a/Doc/whatsnew/3.13.rst b/Doc/whatsnew/3.13.rst index cdc48a547ce2671..0771b6a4fdb8008 100644 --- a/Doc/whatsnew/3.13.rst +++ b/Doc/whatsnew/3.13.rst @@ -357,6 +357,18 @@ Deprecated ``PY_UNICODE_TYPE`` are just aliases to ``wchar_t``. (Contributed by Victor Stinner in :gh:`105156`.) +* Deprecate old Python initialization functions: + + * :c:func:`PySys_ResetWarnOptions` + * :c:func:`Py_GetExecPrefix` + * :c:func:`Py_GetPath` + * :c:func:`Py_GetPrefix` + * :c:func:`Py_GetProgramFullPath` + * :c:func:`Py_GetProgramName` + * :c:func:`Py_GetPythonHome` + + (Contributed by Victor Stinner in :gh:`105145`.) + Removed ------- diff --git a/Include/pylifecycle.h b/Include/pylifecycle.h index 0190b4c3f5dedac..34f32a5000e9d5f 100644 --- a/Include/pylifecycle.h +++ b/Include/pylifecycle.h @@ -34,12 +34,12 @@ PyAPI_FUNC(int) Py_Main(int argc, wchar_t **argv); PyAPI_FUNC(int) Py_BytesMain(int argc, char **argv); /* In pathconfig.c */ -PyAPI_FUNC(wchar_t *) Py_GetProgramName(void); -PyAPI_FUNC(wchar_t *) Py_GetPythonHome(void); -PyAPI_FUNC(wchar_t *) Py_GetProgramFullPath(void); -PyAPI_FUNC(wchar_t *) Py_GetPrefix(void); -PyAPI_FUNC(wchar_t *) Py_GetExecPrefix(void); -PyAPI_FUNC(wchar_t *) Py_GetPath(void); +Py_DEPRECATED(3.13) PyAPI_FUNC(wchar_t *) Py_GetProgramName(void); +Py_DEPRECATED(3.13) PyAPI_FUNC(wchar_t *) Py_GetPythonHome(void); +Py_DEPRECATED(3.13) PyAPI_FUNC(wchar_t *) Py_GetProgramFullPath(void); +Py_DEPRECATED(3.13) PyAPI_FUNC(wchar_t *) Py_GetPrefix(void); +Py_DEPRECATED(3.13) PyAPI_FUNC(wchar_t *) Py_GetExecPrefix(void); +Py_DEPRECATED(3.13) PyAPI_FUNC(wchar_t *) Py_GetPath(void); #ifdef MS_WINDOWS int _Py_CheckPython3(void); #endif diff --git a/Include/sysmodule.h b/Include/sysmodule.h index 5fd21f5fa30a2b8..225e0602d191e1a 100644 --- a/Include/sysmodule.h +++ b/Include/sysmodule.h @@ -17,7 +17,7 @@ PyAPI_FUNC(void) PySys_WriteStderr(const char *format, ...) PyAPI_FUNC(void) PySys_FormatStdout(const char *format, ...); PyAPI_FUNC(void) PySys_FormatStderr(const char *format, ...); -PyAPI_FUNC(void) PySys_ResetWarnOptions(void); +Py_DEPRECATED(3.13) PyAPI_FUNC(void) PySys_ResetWarnOptions(void); PyAPI_FUNC(PyObject *) PySys_GetXOptions(void); diff --git a/Misc/NEWS.d/next/C API/2023-06-01-09-40-30.gh-issue-105145.WOOE-w.rst b/Misc/NEWS.d/next/C API/2023-06-01-09-40-30.gh-issue-105145.WOOE-w.rst new file mode 100644 index 000000000000000..13dff7699087923 --- /dev/null +++ b/Misc/NEWS.d/next/C API/2023-06-01-09-40-30.gh-issue-105145.WOOE-w.rst @@ -0,0 +1,11 @@ +Deprecate old Python initialization functions: + +* :c:func:`PySys_ResetWarnOptions` +* :c:func:`Py_GetExecPrefix` +* :c:func:`Py_GetPath` +* :c:func:`Py_GetPrefix` +* :c:func:`Py_GetProgramFullPath` +* :c:func:`Py_GetProgramName` +* :c:func:`Py_GetPythonHome` + +Patch by Victor Stinner. diff --git a/Modules/_tkinter.c b/Modules/_tkinter.c index 49c94447c7237cd..5e56fe14a34337d 100644 --- a/Modules/_tkinter.c +++ b/Modules/_tkinter.c @@ -3289,8 +3289,8 @@ PyInit__tkinter(void) /* This helps the dynamic loader; in Unicode aware Tcl versions it also helps Tcl find its encodings. */ - uexe = PyUnicode_FromWideChar(Py_GetProgramName(), -1); - if (uexe) { + uexe = PySys_GetObject("executable"); // borrowed reference + if (uexe && PyUnicode_Check(uexe)) { // sys.executable can be None cexe = PyUnicode_EncodeFSDefault(uexe); if (cexe) { #ifdef MS_WINDOWS @@ -3329,7 +3329,6 @@ PyInit__tkinter(void) #endif /* MS_WINDOWS */ } Py_XDECREF(cexe); - Py_DECREF(uexe); } if (PyErr_Occurred()) {