gh-139482: Add posix._clearenv() function (#139965)
This commit is contained in:
11
Lib/os.py
11
Lib/os.py
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.
|
||||
27
Modules/clinic/posixmodule.c.h
generated
27
Modules/clinic/posixmodule.c.h
generated
@@ -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]*/
|
||||
|
||||
@@ -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
6
configure
generated
vendored
@@ -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
|
||||
|
||||
@@ -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 \
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user