[3.13] gh-130940: Remove PyConfig.use_system_logger (#131129)

Removes ``PyConfig.use_system_logger``, resolving an ABI incompatibility introduced in
3.13.2.

Changes the default behavior of iOS to *always* direct stdout/stderr to the system log.
This commit is contained in:
Russell Keith-Magee 2025-03-13 11:53:11 +08:00 committed by GitHub
parent 65b58291b0
commit 589f422d1b
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
9 changed files with 19 additions and 57 deletions

View file

@ -1271,17 +1271,6 @@ PyConfig
Default: ``1`` in Python config and ``0`` in isolated config.
.. c:member:: int use_system_logger
If non-zero, ``stdout`` and ``stderr`` will be redirected to the system
log.
Only available on macOS 10.12 and later, and on iOS.
Default: ``0`` (don't use system log).
.. versionadded:: 3.13.2
.. c:member:: int user_site_directory
If non-zero, add the user site directory to :data:`sys.path`.

View file

@ -296,8 +296,6 @@ To add Python to an iOS Xcode project:
* Buffered stdio (:c:member:`PyConfig.buffered_stdio`) is *disabled*;
* Writing bytecode (:c:member:`PyConfig.write_bytecode`) is *disabled*;
* Signal handlers (:c:member:`PyConfig.install_signal_handlers`) are *enabled*;
* System logging (:c:member:`PyConfig.use_system_logger`) is *enabled*
(optional, but strongly recommended);
* ``PYTHONHOME`` for the interpreter is configured to point at the
``python`` subfolder of your app's bundle; and
* The ``PYTHONPATH`` for the interpreter includes:

View file

@ -179,9 +179,6 @@ typedef struct PyConfig {
int use_frozen_modules;
int safe_path;
int int_max_str_digits;
#ifdef __APPLE__
int use_system_logger;
#endif
int cpu_count;
#ifdef Py_GIL_DISABLED

View file

@ -1,10 +1,10 @@
import unittest
from _apple_support import SystemLog
from test.support import is_apple
from test.support import is_apple_mobile
from unittest.mock import Mock, call
if not is_apple:
raise unittest.SkipTest("Apple-specific")
if not is_apple_mobile:
raise unittest.SkipTest("iOS-specific")
# Test redirection of stdout and stderr to the Apple system log.

View file

@ -627,8 +627,6 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase):
CONFIG_COMPAT.update({
'legacy_windows_stdio': 0,
})
if support.is_apple:
CONFIG_COMPAT['use_system_logger'] = False
CONFIG_PYTHON = dict(CONFIG_COMPAT,
_config_init=API_PYTHON,

View file

@ -0,0 +1,4 @@
The ``PyConfig.use_system_logger`` attribute, introduced in Python 3.13.2, has
been removed. The introduction of this attribute inadvertently introduced an
ABI breakage on macOS and iOS. The use of the system logger is now enabled
by default on iOS, and disabled by default on macOS.

View file

@ -130,9 +130,6 @@ static const PyConfigSpec PYCONFIG_SPEC[] = {
#ifdef Py_DEBUG
SPEC(run_presite, WSTR_OPT),
#endif
#ifdef __APPLE__
SPEC(use_system_logger, BOOL),
#endif
{NULL, 0, 0},
};
@ -751,9 +748,6 @@ config_check_consistency(const PyConfig *config)
assert(config->cpu_count != 0);
// config->use_frozen_modules is initialized later
// by _PyConfig_InitImportConfig().
#ifdef __APPLE__
assert(config->use_system_logger >= 0);
#endif
#ifdef Py_STATS
assert(config->_pystats >= 0);
#endif
@ -856,9 +850,6 @@ _PyConfig_InitCompatConfig(PyConfig *config)
config->_is_python_build = 0;
config->code_debug_ranges = 1;
config->cpu_count = -1;
#ifdef __APPLE__
config->use_system_logger = 0;
#endif
#ifdef Py_GIL_DISABLED
config->enable_gil = _PyConfig_GIL_DEFAULT;
#endif
@ -887,9 +878,6 @@ config_init_defaults(PyConfig *config)
#ifdef MS_WINDOWS
config->legacy_windows_stdio = 0;
#endif
#ifdef __APPLE__
config->use_system_logger = 0;
#endif
}
@ -925,9 +913,6 @@ PyConfig_InitIsolatedConfig(PyConfig *config)
#ifdef MS_WINDOWS
config->legacy_windows_stdio = 0;
#endif
#ifdef __APPLE__
config->use_system_logger = 0;
#endif
}

View file

@ -47,20 +47,15 @@
# include <TargetConditionals.h>
# include <mach-o/loader.h>
// The os_log unified logging APIs were introduced in macOS 10.12, iOS 10.0,
// tvOS 10.0, and watchOS 3.0;
// tvOS 10.0, and watchOS 3.0; we enable the use of the system logger
// automatically on non-macOS platforms.
# if defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE
# define HAS_APPLE_SYSTEM_LOG 1
# elif defined(TARGET_OS_OSX) && TARGET_OS_OSX
# if defined(MAC_OS_X_VERSION_10_12) && MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_12
# define HAS_APPLE_SYSTEM_LOG 1
# else
# define HAS_APPLE_SYSTEM_LOG 0
# endif
# define USE_APPLE_SYSTEM_LOG 1
# else
# define HAS_APPLE_SYSTEM_LOG 0
# define USE_APPLE_SYSTEM_LOG 0
# endif
# if HAS_APPLE_SYSTEM_LOG
# if USE_APPLE_SYSTEM_LOG
# include <os/log.h>
# endif
#endif
@ -92,7 +87,7 @@ static PyStatus init_sys_streams(PyThreadState *tstate);
#ifdef __ANDROID__
static PyStatus init_android_streams(PyThreadState *tstate);
#endif
#if defined(__APPLE__) && HAS_APPLE_SYSTEM_LOG
#if defined(__APPLE__) && USE_APPLE_SYSTEM_LOG
static PyStatus init_apple_streams(PyThreadState *tstate);
#endif
static void wait_for_thread_shutdown(PyThreadState *tstate);
@ -1280,12 +1275,10 @@ init_interp_main(PyThreadState *tstate)
return status;
}
#endif
#if defined(__APPLE__) && HAS_APPLE_SYSTEM_LOG
if (config->use_system_logger) {
status = init_apple_streams(tstate);
if (_PyStatus_EXCEPTION(status)) {
return status;
}
#if defined(__APPLE__) && USE_APPLE_SYSTEM_LOG
status = init_apple_streams(tstate);
if (_PyStatus_EXCEPTION(status)) {
return status;
}
#endif
@ -2971,7 +2964,7 @@ done:
#endif // __ANDROID__
#if defined(__APPLE__) && HAS_APPLE_SYSTEM_LOG
#if defined(__APPLE__) && USE_APPLE_SYSTEM_LOG
static PyObject *
apple_log_write_impl(PyObject *self, PyObject *args)
@ -3032,7 +3025,7 @@ done:
return status;
}
#endif // __APPLE__ && HAS_APPLE_SYSTEM_LOG
#endif // __APPLE__ && USE_APPLE_SYSTEM_LOG
static void

View file

@ -53,8 +53,6 @@
// Enforce UTF-8 encoding for stderr, stdout, file-system encoding and locale.
// See https://docs.python.org/3/library/os.html#python-utf-8-mode.
preconfig.utf8_mode = 1;
// Use the system logger for stdout/err
config.use_system_logger = 1;
// Don't buffer stdio. We want output to appears in the log immediately
config.buffered_stdio = 0;
// Don't write bytecode; we can't modify the app bundle