[Python-checkins] Revert "bpo-39413: Implement os.unsetenv() on Windows (GH-18104)" (GH-18124)

Victor Stinner webhook-mailer at python.org
Wed Jan 22 15:11:21 EST 2020


https://github.com/python/cpython/commit/b73dd02ea744288831f71363a7467552c09875ea
commit: b73dd02ea744288831f71363a7467552c09875ea
branch: master
author: Victor Stinner <vstinner at python.org>
committer: GitHub <noreply at github.com>
date: 2020-01-22T21:11:17+01:00
summary:

Revert "bpo-39413: Implement os.unsetenv() on Windows (GH-18104)" (GH-18124)

This reverts commit 56cd3710a1ea3ba872d345ea1bebc86ed08bc8b8.

files:
D Misc/NEWS.d/next/Library/2020-01-21-15-48-35.bpo-39413.7XYDM8.rst
M Doc/library/os.rst
M Doc/whatsnew/3.9.rst
M Lib/test/test_os.py
M Modules/clinic/posixmodule.c.h
M Modules/posixmodule.c

diff --git a/Doc/library/os.rst b/Doc/library/os.rst
index de3e5603e109f..4fec647828e25 100644
--- a/Doc/library/os.rst
+++ b/Doc/library/os.rst
@@ -645,9 +645,6 @@ process and user.
 
    .. availability:: most flavors of Unix, Windows.
 
-   .. versionchanged:: 3.9
-      The function is now also available on Windows.
-
 
 .. _os-newstreams:
 
diff --git a/Doc/whatsnew/3.9.rst b/Doc/whatsnew/3.9.rst
index 0e82ff0695d3e..f5835d68515ac 100644
--- a/Doc/whatsnew/3.9.rst
+++ b/Doc/whatsnew/3.9.rst
@@ -216,9 +216,6 @@ Exposed the Linux-specific :func:`os.pidfd_open` (:issue:`38692`) and
 :data:`os.P_PIDFD` (:issue:`38713`) for process management with file
 descriptors.
 
-The :func:`os.unsetenv` function is now also available on Windows.
-(Contributed by Victor Stinner in :issue:`39413`.)
-
 poplib
 ------
 
diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py
index 50535da0a2bfc..82c441c204835 100644
--- a/Lib/test/test_os.py
+++ b/Lib/test/test_os.py
@@ -956,9 +956,14 @@ def test_environb(self):
     # On OS X < 10.6, unsetenv() doesn't return a value (bpo-13415).
     @support.requires_mac_ver(10, 6)
     def test_unset_error(self):
-        # "=" is not allowed in a variable name
-        key = 'key='
-        self.assertRaises(OSError, os.environ.__delitem__, key)
+        if sys.platform == "win32":
+            # an environment variable is limited to 32,767 characters
+            key = 'x' * 50000
+            self.assertRaises(ValueError, os.environ.__delitem__, key)
+        else:
+            # "=" is not allowed in a variable name
+            key = 'key='
+            self.assertRaises(OSError, os.environ.__delitem__, key)
 
     def test_key_type(self):
         missing = 'missingkey'
diff --git a/Misc/NEWS.d/next/Library/2020-01-21-15-48-35.bpo-39413.7XYDM8.rst b/Misc/NEWS.d/next/Library/2020-01-21-15-48-35.bpo-39413.7XYDM8.rst
deleted file mode 100644
index a185ab5efe2ed..0000000000000
--- a/Misc/NEWS.d/next/Library/2020-01-21-15-48-35.bpo-39413.7XYDM8.rst
+++ /dev/null
@@ -1 +0,0 @@
-The :func:`os.unsetenv` function is now also available on Windows.
diff --git a/Modules/clinic/posixmodule.c.h b/Modules/clinic/posixmodule.c.h
index 661d91afb7eb6..aa4756a620aae 100644
--- a/Modules/clinic/posixmodule.c.h
+++ b/Modules/clinic/posixmodule.c.h
@@ -6125,43 +6125,7 @@ os_putenv(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
 
 #endif /* defined(HAVE_PUTENV) && !defined(MS_WINDOWS) */
 
-#if defined(MS_WINDOWS)
-
-PyDoc_STRVAR(os_unsetenv__doc__,
-"unsetenv($module, name, /)\n"
-"--\n"
-"\n"
-"Delete an environment variable.");
-
-#define OS_UNSETENV_METHODDEF    \
-    {"unsetenv", (PyCFunction)os_unsetenv, METH_O, os_unsetenv__doc__},
-
-static PyObject *
-os_unsetenv_impl(PyObject *module, PyObject *name);
-
-static PyObject *
-os_unsetenv(PyObject *module, PyObject *arg)
-{
-    PyObject *return_value = NULL;
-    PyObject *name;
-
-    if (!PyUnicode_Check(arg)) {
-        _PyArg_BadArgument("unsetenv", "argument", "str", arg);
-        goto exit;
-    }
-    if (PyUnicode_READY(arg) == -1) {
-        goto exit;
-    }
-    name = arg;
-    return_value = os_unsetenv_impl(module, name);
-
-exit:
-    return return_value;
-}
-
-#endif /* defined(MS_WINDOWS) */
-
-#if (defined(HAVE_UNSETENV) && !defined(MS_WINDOWS))
+#if defined(HAVE_UNSETENV)
 
 PyDoc_STRVAR(os_unsetenv__doc__,
 "unsetenv($module, name, /)\n"
@@ -6193,7 +6157,7 @@ os_unsetenv(PyObject *module, PyObject *arg)
     return return_value;
 }
 
-#endif /* (defined(HAVE_UNSETENV) && !defined(MS_WINDOWS)) */
+#endif /* defined(HAVE_UNSETENV) */
 
 PyDoc_STRVAR(os_strerror__doc__,
 "strerror($module, code, /)\n"
@@ -8809,4 +8773,4 @@ os__remove_dll_directory(PyObject *module, PyObject *const *args, Py_ssize_t nar
 #ifndef OS__REMOVE_DLL_DIRECTORY_METHODDEF
     #define OS__REMOVE_DLL_DIRECTORY_METHODDEF
 #endif /* !defined(OS__REMOVE_DLL_DIRECTORY_METHODDEF) */
-/*[clinic end generated code: output=6e739a2715712e88 input=a9049054013a1b77]*/
+/*[clinic end generated code: output=51ba5b9536420cea input=a9049054013a1b77]*/
diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c
index 5a0c8a311a790..e0eecfa6d1143 100644
--- a/Modules/posixmodule.c
+++ b/Modules/posixmodule.c
@@ -10180,51 +10180,7 @@ os_putenv_impl(PyObject *module, PyObject *name, PyObject *value)
 #endif /* HAVE_PUTENV */
 
 
-#ifdef MS_WINDOWS
-/*[clinic input]
-os.unsetenv
-    name: unicode
-    /
-
-Delete an environment variable.
-[clinic start generated code]*/
-
-static PyObject *
-os_unsetenv_impl(PyObject *module, PyObject *name)
-/*[clinic end generated code: output=54c4137ab1834f02 input=4d6a1747cc526d2f]*/
-{
-    /* PyUnicode_AsWideCharString() rejects embedded null characters */
-    wchar_t *name_str = PyUnicode_AsWideCharString(name, NULL);
-    if (name_str == NULL) {
-        return NULL;
-    }
-
-    BOOL ok = SetEnvironmentVariableW(name_str, NULL);
-    PyMem_Free(name_str);
-
-    if (!ok) {
-        return PyErr_SetFromWindowsErr(0);
-    }
-
-#ifdef PY_PUTENV_DICT
-    /* Remove the key from putenv_dict;
-     * this will cause it to be collected.  This has to
-     * happen after the real unsetenv() call because the
-     * old value was still accessible until then.
-     */
-    if (PyDict_DelItem(_posixstate(module)->putenv_dict, name)) {
-        /* really not much we can do; just leak */
-        if (!PyErr_ExceptionMatches(PyExc_KeyError)) {
-            return NULL;
-        }
-        PyErr_Clear();
-    }
-#endif
-
-    Py_RETURN_NONE;
-}
-/* repeat !defined(MS_WINDOWS) to workaround an Argument Clinic issue */
-#elif defined(HAVE_UNSETENV) && !defined(MS_WINDOWS)
+#ifdef HAVE_UNSETENV
 /*[clinic input]
 os.unsetenv
     name: FSConverter



More information about the Python-checkins mailing list