summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Doc/library/os.rst6
-rw-r--r--Doc/whatsnew/3.13.rst4
-rw-r--r--Lib/subprocess.py3
-rw-r--r--Misc/NEWS.d/next/Library/2023-12-15-18-13-59.gh-issue-113119.al-569.rst2
-rw-r--r--Modules/posixmodule.c16
5 files changed, 21 insertions, 10 deletions
diff --git a/Doc/library/os.rst b/Doc/library/os.rst
index 2ff0b73..a079f1f 100644
--- a/Doc/library/os.rst
+++ b/Doc/library/os.rst
@@ -4570,7 +4570,8 @@ written in Python, such as a mail server's external command delivery program.
Most users should use :func:`subprocess.run` instead of :func:`posix_spawn`.
The positional-only arguments *path*, *args*, and *env* are similar to
- :func:`execve`.
+ :func:`execve`. *env* is allowed to be ``None``, in which case current
+ process' environment is used.
The *path* parameter is the path to the executable file. The *path* should
contain a directory. Use :func:`posix_spawnp` to pass an executable file
@@ -4645,6 +4646,9 @@ written in Python, such as a mail server's external command delivery program.
.. versionadded:: 3.8
+ .. versionchanged:: 3.13
+ *env* parameter accepts ``None``.
+
.. availability:: Unix, not Emscripten, not WASI.
.. function:: posix_spawnp(path, argv, env, *, file_actions=None, \
diff --git a/Doc/whatsnew/3.13.rst b/Doc/whatsnew/3.13.rst
index ce4f66b..4af0235 100644
--- a/Doc/whatsnew/3.13.rst
+++ b/Doc/whatsnew/3.13.rst
@@ -289,6 +289,10 @@ os
``False`` on Windows.
(Contributed by Serhiy Storchaka in :gh:`59616`)
+* :func:`os.posix_spawn` now accepts ``env=None``, which makes the newly spawned
+ process use the current process environment.
+ (Contributed by Jakub Kulik in :gh:`113119`.)
+
pathlib
-------
diff --git a/Lib/subprocess.py b/Lib/subprocess.py
index d6edd1a..1919ea4 100644
--- a/Lib/subprocess.py
+++ b/Lib/subprocess.py
@@ -1756,9 +1756,6 @@ class Popen:
c2pread, c2pwrite,
errread, errwrite):
"""Execute program using os.posix_spawn()."""
- if env is None:
- env = os.environ
-
kwargs = {}
if restore_signals:
# See _Py_RestoreSignals() in Python/pylifecycle.c
diff --git a/Misc/NEWS.d/next/Library/2023-12-15-18-13-59.gh-issue-113119.al-569.rst b/Misc/NEWS.d/next/Library/2023-12-15-18-13-59.gh-issue-113119.al-569.rst
new file mode 100644
index 0000000..94087b0
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2023-12-15-18-13-59.gh-issue-113119.al-569.rst
@@ -0,0 +1,2 @@
+:func:`os.posix_spawn` now accepts ``env=None``, which makes the newly spawned
+process use the current process environment. Patch by Jakub Kulik.
diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c
index b464a28..2dc5d7d 100644
--- a/Modules/posixmodule.c
+++ b/Modules/posixmodule.c
@@ -7129,9 +7129,9 @@ py_posix_spawn(int use_posix_spawnp, PyObject *module, path_t *path, PyObject *a
return NULL;
}
- if (!PyMapping_Check(env)) {
+ if (!PyMapping_Check(env) && env != Py_None) {
PyErr_Format(PyExc_TypeError,
- "%s: environment must be a mapping object", func_name);
+ "%s: environment must be a mapping object or None", func_name);
goto exit;
}
@@ -7145,9 +7145,13 @@ py_posix_spawn(int use_posix_spawnp, PyObject *module, path_t *path, PyObject *a
goto exit;
}
- envlist = parse_envlist(env, &envc);
- if (envlist == NULL) {
- goto exit;
+ if (env == Py_None) {
+ envlist = environ;
+ } else {
+ envlist = parse_envlist(env, &envc);
+ if (envlist == NULL) {
+ goto exit;
+ }
}
if (file_actions != NULL && file_actions != Py_None) {
@@ -7210,7 +7214,7 @@ exit:
if (attrp) {
(void)posix_spawnattr_destroy(attrp);
}
- if (envlist) {
+ if (envlist && envlist != environ) {
free_string_array(envlist, envc);
}
if (argvlist) {