bpo-44113: Deprecate old functions to config Python init (GH-26060)

Deprecate the following functions to configure the Python
initialization:

* PySys_AddWarnOption()
* PySys_AddWarnOptionUnicode()
* PySys_AddXOption()
* PySys_HasWarnOptions()
* Py_SetPath()
* Py_SetProgramName()
* Py_SetPythonHome()
* Py_SetStandardStreamEncoding()
* _Py_SetProgramFullPath()

Use the new PyConfig API of the Python Initialization Configuration
instead (PEP 587).
This commit is contained in:
Victor Stinner 2021-05-12 23:59:25 +02:00 committed by GitHub
parent 504ffdae4e
commit 6cd0446ef7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 98 additions and 10 deletions

View File

@ -323,6 +323,11 @@ Process-wide parameters
single: main() single: main()
triple: stdin; stdout; sdterr triple: stdin; stdout; sdterr
This API is kept for backward compatibility: setting
:c:member:`PyConfig.stdio_encoding` and :c:member:`PyConfig.stdio_errors`
should be used instead, see :ref:`Python Initialization Configuration
<init-config>`.
This function should be called before :c:func:`Py_Initialize`, if it is This function should be called before :c:func:`Py_Initialize`, if it is
called at all. It specifies which encoding and error handling to use called at all. It specifies which encoding and error handling to use
with standard IO, with the same meanings as in :func:`str.encode`. with standard IO, with the same meanings as in :func:`str.encode`.
@ -345,6 +350,8 @@ Process-wide parameters
.. versionadded:: 3.4 .. versionadded:: 3.4
.. deprecated:: 3.11
.. c:function:: void Py_SetProgramName(const wchar_t *name) .. c:function:: void Py_SetProgramName(const wchar_t *name)
@ -353,6 +360,10 @@ Process-wide parameters
single: main() single: main()
single: Py_GetPath() single: Py_GetPath()
This API is kept for backward compatibility: setting
:c:member:`PyConfig.program_name` should be used instead, see :ref:`Python
Initialization Configuration <init-config>`.
This function should be called before :c:func:`Py_Initialize` is called for This function should be called before :c:func:`Py_Initialize` is called for
the first time, if it is called at all. It tells the interpreter the value the first time, if it is called at all. It tells the interpreter the value
of the ``argv[0]`` argument to the :c:func:`main` function of the program of the ``argv[0]`` argument to the :c:func:`main` function of the program
@ -367,6 +378,8 @@ Process-wide parameters
Use :c:func:`Py_DecodeLocale` to decode a bytes string to get a Use :c:func:`Py_DecodeLocale` to decode a bytes string to get a
:c:type:`wchar_*` string. :c:type:`wchar_*` string.
.. deprecated:: 3.11
.. c:function:: wchar* Py_GetProgramName() .. c:function:: wchar* Py_GetProgramName()
@ -495,6 +508,11 @@ Process-wide parameters
single: path (in module sys) single: path (in module sys)
single: Py_GetPath() single: Py_GetPath()
This API is kept for backward compatibility: setting
:c:member:`PyConfig.module_search_paths` and
:c:member:`PyConfig.module_search_paths_set` should be used instead, see
:ref:`Python Initialization Configuration <init-config>`.
Set the default module search path. If this function is called before Set the default module search path. If this function is called before
:c:func:`Py_Initialize`, then :c:func:`Py_GetPath` won't attempt to compute a :c:func:`Py_Initialize`, then :c:func:`Py_GetPath` won't attempt to compute a
default search path but uses the one provided instead. This is useful if default search path but uses the one provided instead. This is useful if
@ -518,6 +536,8 @@ Process-wide parameters
The program full path is now used for :data:`sys.executable`, instead The program full path is now used for :data:`sys.executable`, instead
of the program name. of the program name.
.. deprecated:: 3.11
.. c:function:: const char* Py_GetVersion() .. c:function:: const char* Py_GetVersion()
@ -617,6 +637,9 @@ Process-wide parameters
Use :c:func:`Py_DecodeLocale` to decode a bytes string to get a Use :c:func:`Py_DecodeLocale` to decode a bytes string to get a
:c:type:`wchar_*` string. :c:type:`wchar_*` string.
See also :c:member:`PyConfig.orig_argv` and :c:member:`PyConfig.argv`
members of the :ref:`Python Initialization Configuration <init-config>`.
.. note:: .. note::
It is recommended that applications embedding the Python interpreter It is recommended that applications embedding the Python interpreter
for purposes other than executing a single script pass ``0`` as *updatepath*, for purposes other than executing a single script pass ``0`` as *updatepath*,
@ -644,11 +667,18 @@ Process-wide parameters
Use :c:func:`Py_DecodeLocale` to decode a bytes string to get a Use :c:func:`Py_DecodeLocale` to decode a bytes string to get a
:c:type:`wchar_*` string. :c:type:`wchar_*` string.
See also :c:member:`PyConfig.orig_argv` and :c:member:`PyConfig.argv`
members of the :ref:`Python Initialization Configuration <init-config>`.
.. versionchanged:: 3.4 The *updatepath* value depends on :option:`-I`. .. versionchanged:: 3.4 The *updatepath* value depends on :option:`-I`.
.. c:function:: void Py_SetPythonHome(const wchar_t *home) .. c:function:: void Py_SetPythonHome(const wchar_t *home)
This API is kept for backward compatibility: setting
:c:member:`PyConfig.home` should be used instead, see :ref:`Python
Initialization Configuration <init-config>`.
Set the default "home" directory, that is, the location of the standard Set the default "home" directory, that is, the location of the standard
Python libraries. See :envvar:`PYTHONHOME` for the meaning of the Python libraries. See :envvar:`PYTHONHOME` for the meaning of the
argument string. argument string.
@ -661,6 +691,8 @@ Process-wide parameters
Use :c:func:`Py_DecodeLocale` to decode a bytes string to get a Use :c:func:`Py_DecodeLocale` to decode a bytes string to get a
:c:type:`wchar_*` string. :c:type:`wchar_*` string.
.. deprecated:: 3.11
.. c:function:: w_char* Py_GetPythonHome() .. c:function:: w_char* Py_GetPythonHome()

View File

@ -476,6 +476,8 @@ Customize Memory Allocators
the :c:func:`PyMem_SetupDebugHooks` function must be called to reinstall the the :c:func:`PyMem_SetupDebugHooks` function must be called to reinstall the
debug hooks on top on the new allocator. debug hooks on top on the new allocator.
See also :c:member:`PyPreConfig.allocator` and :ref:`Preinitialize Python
with PyPreConfig <c-preinit>`.
.. c:function:: void PyMem_SetupDebugHooks(void) .. c:function:: void PyMem_SetupDebugHooks(void)

View File

@ -237,11 +237,21 @@ accessible to C code. They all work with the current interpreter thread's
.. c:function:: void PySys_AddWarnOption(const wchar_t *s) .. c:function:: void PySys_AddWarnOption(const wchar_t *s)
This API is kept for backward compatibility: setting
:c:member:`PyConfig.warnoptions` should be used instead, see :ref:`Python
Initialization Configuration <init-config>`.
Append *s* to :data:`sys.warnoptions`. This function must be called prior Append *s* to :data:`sys.warnoptions`. This function must be called prior
to :c:func:`Py_Initialize` in order to affect the warnings filter list. to :c:func:`Py_Initialize` in order to affect the warnings filter list.
.. deprecated:: 3.11
.. c:function:: void PySys_AddWarnOptionUnicode(PyObject *unicode) .. c:function:: void PySys_AddWarnOptionUnicode(PyObject *unicode)
This API is kept for backward compatibility: setting
:c:member:`PyConfig.warnoptions` should be used instead, see :ref:`Python
Initialization Configuration <init-config>`.
Append *unicode* to :data:`sys.warnoptions`. Append *unicode* to :data:`sys.warnoptions`.
Note: this function is not currently usable from outside the CPython Note: this function is not currently usable from outside the CPython
@ -250,6 +260,8 @@ accessible to C code. They all work with the current interpreter thread's
called until enough of the runtime has been initialized to permit the called until enough of the runtime has been initialized to permit the
creation of Unicode objects. creation of Unicode objects.
.. deprecated:: 3.11
.. c:function:: void PySys_SetPath(const wchar_t *path) .. c:function:: void PySys_SetPath(const wchar_t *path)
Set :data:`sys.path` to a list object of paths found in *path* which should Set :data:`sys.path` to a list object of paths found in *path* which should
@ -294,12 +306,18 @@ accessible to C code. They all work with the current interpreter thread's
.. c:function:: void PySys_AddXOption(const wchar_t *s) .. c:function:: void PySys_AddXOption(const wchar_t *s)
This API is kept for backward compatibility: setting
:c:member:`PyConfig.xoptions` should be used instead, see :ref:`Python
Initialization Configuration <init-config>`.
Parse *s* as a set of :option:`-X` options and add them to the current Parse *s* as a set of :option:`-X` options and add them to the current
options mapping as returned by :c:func:`PySys_GetXOptions`. This function options mapping as returned by :c:func:`PySys_GetXOptions`. This function
may be called prior to :c:func:`Py_Initialize`. may be called prior to :c:func:`Py_Initialize`.
.. versionadded:: 3.2 .. versionadded:: 3.2
.. deprecated:: 3.11
.. c:function:: PyObject *PySys_GetXOptions() .. c:function:: PyObject *PySys_GetXOptions()
Return the current dictionary of :option:`-X` options, similarly to Return the current dictionary of :option:`-X` options, similarly to

View File

@ -139,3 +139,19 @@ Removed
* :c:func:`PyFrame_BlockSetup` and :c:func:`PyFrame_BlockPop` have been * :c:func:`PyFrame_BlockSetup` and :c:func:`PyFrame_BlockPop` have been
removed. removed.
(Contributed by Mark Shannon in :issue:`40222`.) (Contributed by Mark Shannon in :issue:`40222`.)
* Deprecate the following functions to configure the Python initialization:
* :c:func:`PySys_AddWarnOptionUnicode`
* :c:func:`PySys_AddWarnOption`
* :c:func:`PySys_AddXOption`
* :c:func:`PySys_HasWarnOptions`
* :c:func:`Py_SetPath`
* :c:func:`Py_SetProgramName`
* :c:func:`Py_SetPythonHome`
* :c:func:`Py_SetStandardStreamEncoding`
* :c:func:`_Py_SetProgramFullPath`
Use the new :c:type:`PyConfig` API of the :ref:`Python Initialization Configuration
<init-config>` instead (:pep:`587`).
(Contributed by Victor Stinner in :issue:`44113`.)

View File

@ -5,7 +5,8 @@
/* Only used by applications that embed the interpreter and need to /* Only used by applications that embed the interpreter and need to
* override the standard encoding determination mechanism * override the standard encoding determination mechanism
*/ */
PyAPI_FUNC(int) Py_SetStandardStreamEncoding(const char *encoding, Py_DEPRECATED(3.11) PyAPI_FUNC(int) Py_SetStandardStreamEncoding(
const char *encoding,
const char *errors); const char *errors);
/* PEP 432 Multi-phase initialization API (Private while provisional!) */ /* PEP 432 Multi-phase initialization API (Private while provisional!) */
@ -41,7 +42,7 @@ PyAPI_FUNC(void) _Py_RestoreSignals(void);
PyAPI_FUNC(int) Py_FdIsInteractive(FILE *, const char *); PyAPI_FUNC(int) Py_FdIsInteractive(FILE *, const char *);
PyAPI_FUNC(int) _Py_FdIsInteractive(FILE *fp, PyObject *filename); PyAPI_FUNC(int) _Py_FdIsInteractive(FILE *fp, PyObject *filename);
PyAPI_FUNC(void) _Py_SetProgramFullPath(const wchar_t *); Py_DEPRECATED(3.11) PyAPI_FUNC(void) _Py_SetProgramFullPath(const wchar_t *);
PyAPI_FUNC(const char *) _Py_gitidentifier(void); PyAPI_FUNC(const char *) _Py_gitidentifier(void);
PyAPI_FUNC(const char *) _Py_gitversion(void); PyAPI_FUNC(const char *) _Py_gitversion(void);

View File

@ -37,10 +37,10 @@ PyAPI_FUNC(int) Py_FrozenMain(int argc, char **argv);
PyAPI_FUNC(int) Py_BytesMain(int argc, char **argv); PyAPI_FUNC(int) Py_BytesMain(int argc, char **argv);
/* In pathconfig.c */ /* In pathconfig.c */
PyAPI_FUNC(void) Py_SetProgramName(const wchar_t *); Py_DEPRECATED(3.11) PyAPI_FUNC(void) Py_SetProgramName(const wchar_t *);
PyAPI_FUNC(wchar_t *) Py_GetProgramName(void); PyAPI_FUNC(wchar_t *) Py_GetProgramName(void);
PyAPI_FUNC(void) Py_SetPythonHome(const wchar_t *); Py_DEPRECATED(3.11) PyAPI_FUNC(void) Py_SetPythonHome(const wchar_t *);
PyAPI_FUNC(wchar_t *) Py_GetPythonHome(void); PyAPI_FUNC(wchar_t *) Py_GetPythonHome(void);
PyAPI_FUNC(wchar_t *) Py_GetProgramFullPath(void); PyAPI_FUNC(wchar_t *) Py_GetProgramFullPath(void);
@ -48,7 +48,7 @@ PyAPI_FUNC(wchar_t *) Py_GetProgramFullPath(void);
PyAPI_FUNC(wchar_t *) Py_GetPrefix(void); PyAPI_FUNC(wchar_t *) Py_GetPrefix(void);
PyAPI_FUNC(wchar_t *) Py_GetExecPrefix(void); PyAPI_FUNC(wchar_t *) Py_GetExecPrefix(void);
PyAPI_FUNC(wchar_t *) Py_GetPath(void); PyAPI_FUNC(wchar_t *) Py_GetPath(void);
PyAPI_FUNC(void) Py_SetPath(const wchar_t *); Py_DEPRECATED(3.11) PyAPI_FUNC(void) Py_SetPath(const wchar_t *);
#ifdef MS_WINDOWS #ifdef MS_WINDOWS
int _Py_CheckPython3(void); int _Py_CheckPython3(void);
#endif #endif

View File

@ -22,11 +22,11 @@ PyAPI_FUNC(void) PySys_FormatStdout(const char *format, ...);
PyAPI_FUNC(void) PySys_FormatStderr(const char *format, ...); PyAPI_FUNC(void) PySys_FormatStderr(const char *format, ...);
PyAPI_FUNC(void) PySys_ResetWarnOptions(void); PyAPI_FUNC(void) PySys_ResetWarnOptions(void);
PyAPI_FUNC(void) PySys_AddWarnOption(const wchar_t *); Py_DEPRECATED(3.11) PyAPI_FUNC(void) PySys_AddWarnOption(const wchar_t *);
PyAPI_FUNC(void) PySys_AddWarnOptionUnicode(PyObject *); Py_DEPRECATED(3.11) PyAPI_FUNC(void) PySys_AddWarnOptionUnicode(PyObject *);
PyAPI_FUNC(int) PySys_HasWarnOptions(void); Py_DEPRECATED(3.11) PyAPI_FUNC(int) PySys_HasWarnOptions(void);
PyAPI_FUNC(void) PySys_AddXOption(const wchar_t *); Py_DEPRECATED(3.11) PyAPI_FUNC(void) PySys_AddXOption(const wchar_t *);
PyAPI_FUNC(PyObject *) PySys_GetXOptions(void); PyAPI_FUNC(PyObject *) PySys_GetXOptions(void);
#ifndef Py_LIMITED_API #ifndef Py_LIMITED_API

View File

@ -0,0 +1,14 @@
Deprecate the following functions to configure the Python initialization:
* :c:func:`PySys_AddWarnOptionUnicode`
* :c:func:`PySys_AddWarnOption`
* :c:func:`PySys_AddXOption`
* :c:func:`PySys_HasWarnOptions`
* :c:func:`Py_SetPath`
* :c:func:`Py_SetProgramName`
* :c:func:`Py_SetPythonHome`
* :c:func:`Py_SetStandardStreamEncoding`
* :c:func:`_Py_SetProgramFullPath`
Use the new :c:type:`PyConfig` API of the :ref:`Python Initialization
Configuration <init-config>` instead (:pep:`587`).

View File

@ -22,6 +22,11 @@
/* Use path starting with "./" avoids a search along the PATH */ /* Use path starting with "./" avoids a search along the PATH */
#define PROGRAM_NAME L"./_testembed" #define PROGRAM_NAME L"./_testembed"
// Ignore Py_DEPRECATED() compiler warnings: deprecated functions are
// tested on purpose here.
_Py_COMP_DIAG_PUSH
_Py_COMP_DIAG_IGNORE_DEPR_DECLS
static void _testembed_Py_Initialize(void) static void _testembed_Py_Initialize(void)
{ {
Py_SetProgramName(PROGRAM_NAME); Py_SetProgramName(PROGRAM_NAME);