diff --git a/Doc/c-api/init.rst b/Doc/c-api/init.rst index f3690ebfab2827..93584e3d3acdfa 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 :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 :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 :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 :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 :data:`sys.path` instead. + .. c:function:: const char* Py_GetVersion() @@ -616,6 +631,10 @@ 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` or :envvar:`PYTHONHOME` environment + variable instead. + .. _threads: diff --git a/Doc/c-api/sys.rst b/Doc/c-api/sys.rst index ad6005b7c7a878..9677b60910aea1 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 :data:`sys.warnoptions` and :data:`warnings.filters` 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 1f1172493cb232..5c81a6077db501 100644 --- a/Doc/whatsnew/3.13.rst +++ b/Doc/whatsnew/3.13.rst @@ -357,6 +357,20 @@ 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`: + clear :data:`sys.warnoptions` and :data:`warnings.filters` instead. + * :c:func:`Py_GetExecPrefix`: get :data:`sys.exec_prefix` instead. + * :c:func:`Py_GetPath`: get :data:`sys.path` instead. + * :c:func:`Py_GetPrefix`: get :data:`sys.prefix` instead. + * :c:func:`Py_GetProgramFullPath`: get :data:`sys.executable` instead. + * :c:func:`Py_GetProgramName`: get :data:`sys.executable` instead. + * :c:func:`Py_GetPythonHome`: get :c:member:`PyConfig.home` or + :envvar:`PYTHONHOME` environment variable instead. + + (Contributed by Victor Stinner in :gh:`105145`.) + Removed ------- diff --git a/Include/pylifecycle.h b/Include/pylifecycle.h index 0190b4c3f5deda..34f32a5000e9d5 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 5fd21f5fa30a2b..225e0602d191e1 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 00000000000000..13dff769908792 --- /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 49c94447c7237c..f06e624d4d50b0 100644 --- a/Modules/_tkinter.c +++ b/Modules/_tkinter.c @@ -130,11 +130,10 @@ _get_tcl_lib_path(void) static int already_checked = 0; if (already_checked == 0) { - PyObject *prefix; struct stat stat_buf; int stat_return_value; - prefix = PyUnicode_FromWideChar(Py_GetPrefix(), -1); + PyObject *prefix = PySys_GetObject("prefix"); // borrowed reference if (prefix == NULL) { return NULL; } @@ -3289,8 +3288,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 +3328,6 @@ PyInit__tkinter(void) #endif /* MS_WINDOWS */ } Py_XDECREF(cexe); - Py_DECREF(uexe); } if (PyErr_Occurred()) {