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.
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`.
* 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:
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
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.
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,
--- /dev/null
+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.
#ifdef Py_DEBUG
SPEC(run_presite, WSTR_OPT),
#endif
-#ifdef __APPLE__
- SPEC(use_system_logger, BOOL),
-#endif
{NULL, 0, 0},
};
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
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
#ifdef MS_WINDOWS
config->legacy_windows_stdio = 0;
#endif
-#ifdef __APPLE__
- config->use_system_logger = 0;
-#endif
}
#ifdef MS_WINDOWS
config->legacy_windows_stdio = 0;
#endif
-#ifdef __APPLE__
- config->use_system_logger = 0;
-#endif
}
# 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
#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);
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
#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)
return status;
}
-#endif // __APPLE__ && HAS_APPLE_SYSTEM_LOG
+#endif // __APPLE__ && USE_APPLE_SYSTEM_LOG
static void
// 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