gh-139482: Add posix._clearenv() function (#139965)

This commit is contained in:
Victor Stinner
2025-10-11 22:58:43 +02:00
committed by GitHub
parent 166cdaa6fb
commit 35e9d41a9c
8 changed files with 80 additions and 3 deletions

View File

@@ -58,6 +58,11 @@ if 'posix' in _names:
__all__.append('_exit')
except ImportError:
pass
try:
from posix import _clearenv
__all__.append('_clearenv')
except ImportError:
pass
import posixpath as path
try:
@@ -768,6 +773,12 @@ class _Environ(MutableMapping):
new.update(self)
return new
if _exists("_clearenv"):
def clear(self):
_clearenv()
self._data.clear()
def _create_environ_mapping():
if name == 'nt':
# Where Env Var Names Must Be UPPERCASE

View File

@@ -1494,6 +1494,14 @@ class EnvironTests(mapping_tests.BasicTestMappingProtocol):
self.assertNotIn(b'test_env', os.environb)
self.assertNotIn('test_env', os.environ)
def test_clearenv(self):
os.environ['REMOVEME'] = '1'
os.environ.clear()
self.assertEqual(os.environ, {})
self.assertRaises(TypeError, os.environ.clear, None)
class WalkTests(unittest.TestCase):
"""Tests for os.walk()."""
is_fwalk = False

View File

@@ -0,0 +1,3 @@
Optimize :data:`os.environ.clear() <os.environ>` by calling
:manpage:`clearenv(3)` when this function is available.
Patch by Victor Stinner.

View File

@@ -9539,6 +9539,27 @@ exit:
#endif /* !defined(MS_WINDOWS) */
#if defined(HAVE_CLEARENV)
PyDoc_STRVAR(os__clearenv__doc__,
"_clearenv($module, /)\n"
"--\n"
"\n");
#define OS__CLEARENV_METHODDEF \
{"_clearenv", (PyCFunction)os__clearenv, METH_NOARGS, os__clearenv__doc__},
static PyObject *
os__clearenv_impl(PyObject *module);
static PyObject *
os__clearenv(PyObject *module, PyObject *Py_UNUSED(ignored))
{
return os__clearenv_impl(module);
}
#endif /* defined(HAVE_CLEARENV) */
PyDoc_STRVAR(os_strerror__doc__,
"strerror($module, code, /)\n"
"--\n"
@@ -13292,6 +13313,10 @@ exit:
#define OS_UNSETENV_METHODDEF
#endif /* !defined(OS_UNSETENV_METHODDEF) */
#ifndef OS__CLEARENV_METHODDEF
#define OS__CLEARENV_METHODDEF
#endif /* !defined(OS__CLEARENV_METHODDEF) */
#ifndef OS_WCOREDUMP_METHODDEF
#define OS_WCOREDUMP_METHODDEF
#endif /* !defined(OS_WCOREDUMP_METHODDEF) */
@@ -13447,4 +13472,4 @@ exit:
#ifndef OS__EMSCRIPTEN_LOG_METHODDEF
#define OS__EMSCRIPTEN_LOG_METHODDEF
#endif /* !defined(OS__EMSCRIPTEN_LOG_METHODDEF) */
/*[clinic end generated code: output=47ace1528820858b input=a9049054013a1b77]*/
/*[clinic end generated code: output=67f0df7cd5a7de20 input=a9049054013a1b77]*/

View File

@@ -13201,6 +13201,25 @@ os_unsetenv_impl(PyObject *module, PyObject *name)
#endif /* !MS_WINDOWS */
#ifdef HAVE_CLEARENV
/*[clinic input]
os._clearenv
[clinic start generated code]*/
static PyObject *
os__clearenv_impl(PyObject *module)
/*[clinic end generated code: output=2d6705d62c014b51 input=47d2fa7f323c43ca]*/
{
errno = 0;
int err = clearenv();
if (err) {
return posix_error();
}
Py_RETURN_NONE;
}
#endif
/*[clinic input]
os.strerror
@@ -17167,6 +17186,7 @@ static PyMethodDef posix_methods[] = {
OS_POSIX_FADVISE_METHODDEF
OS_PUTENV_METHODDEF
OS_UNSETENV_METHODDEF
OS__CLEARENV_METHODDEF
OS_STRERROR_METHODDEF
OS_FCHDIR_METHODDEF
OS_FSYNC_METHODDEF

6
configure generated vendored
View File

@@ -19225,6 +19225,12 @@ if test "x$ac_cv_func_chown" = xyes
then :
printf "%s\n" "#define HAVE_CHOWN 1" >>confdefs.h
fi
ac_fn_c_check_func "$LINENO" "clearenv" "ac_cv_func_clearenv"
if test "x$ac_cv_func_clearenv" = xyes
then :
printf "%s\n" "#define HAVE_CLEARENV 1" >>confdefs.h
fi
ac_fn_c_check_func "$LINENO" "clock" "ac_cv_func_clock"
if test "x$ac_cv_func_clock" = xyes

View File

@@ -5226,7 +5226,8 @@ fi
# checks for library functions
AC_CHECK_FUNCS([ \
accept4 alarm bind_textdomain_codeset chmod chown clock closefrom close_range confstr \
accept4 alarm bind_textdomain_codeset chmod chown clearenv \
clock closefrom close_range confstr \
copy_file_range ctermid dladdr dup dup3 execv explicit_bzero explicit_memset \
faccessat fchmod fchmodat fchown fchownat fdopendir fdwalk fexecve \
fork fork1 fpathconf fstatat ftime ftruncate futimens futimes futimesat \

View File

@@ -141,6 +141,9 @@
/* Define if you have the 'chroot' function. */
#undef HAVE_CHROOT
/* Define to 1 if you have the 'clearenv' function. */
#undef HAVE_CLEARENV
/* Define to 1 if you have the 'clock' function. */
#undef HAVE_CLOCK