summaryrefslogtreecommitdiffstats
path: root/Lib/multiprocessing/popen_spawn_win32.py
diff options
context:
space:
mode:
authorSteve Dower <steve.dower@microsoft.com>2019-02-04 07:19:38 (GMT)
committerGitHub <noreply@github.com>2019-02-04 07:19:38 (GMT)
commita8474d025cab794257d2fd0bea67840779b9351f (patch)
tree1e2521303b70f42bd63cf1f432513db9cfd04742 /Lib/multiprocessing/popen_spawn_win32.py
parent2f6fae6e510dba653391cb510a2aca8322eec03b (diff)
downloadcpython-a8474d025cab794257d2fd0bea67840779b9351f.zip
cpython-a8474d025cab794257d2fd0bea67840779b9351f.tar.gz
cpython-a8474d025cab794257d2fd0bea67840779b9351f.tar.bz2
bpo-35872 and bpo-35873: Clears __PYVENV_LAUNCHER__ variable (GH-11745)
After reading __PYVENV_LAUNCHER__ we now set sys._base_executable value for later use. Make the same changes for macOS to avoid extra platform checks.
Diffstat (limited to 'Lib/multiprocessing/popen_spawn_win32.py')
-rw-r--r--Lib/multiprocessing/popen_spawn_win32.py22
1 files changed, 20 insertions, 2 deletions
diff --git a/Lib/multiprocessing/popen_spawn_win32.py b/Lib/multiprocessing/popen_spawn_win32.py
index 3b92c8a..de4c5ec 100644
--- a/Lib/multiprocessing/popen_spawn_win32.py
+++ b/Lib/multiprocessing/popen_spawn_win32.py
@@ -19,6 +19,13 @@ WINEXE = (sys.platform == 'win32' and getattr(sys, 'frozen', False))
WINSERVICE = sys.executable.lower().endswith("pythonservice.exe")
+def _path_eq(p1, p2):
+ return p1 == p2 or os.path.normcase(p1) == os.path.normcase(p2)
+
+WINENV = (hasattr(sys, '_base_executable') and
+ not _path_eq(sys.executable, sys._base_executable))
+
+
def _close_handles(*handles):
for handle in handles:
_winapi.CloseHandle(handle)
@@ -50,12 +57,23 @@ class Popen(object):
pipe_handle=rhandle)
cmd = ' '.join('"%s"' % x for x in cmd)
+ python_exe = spawn.get_executable()
+
+ # bpo-35797: When running in a venv, we bypass the redirect
+ # executor and launch our base Python.
+ if WINENV and _path_eq(python_exe, sys.executable):
+ python_exe = sys._base_executable
+ env = os.environ.copy()
+ env["__PYVENV_LAUNCHER__"] = sys.executable
+ else:
+ env = None
+
with open(wfd, 'wb', closefd=True) as to_child:
# start process
try:
hp, ht, pid, tid = _winapi.CreateProcess(
- spawn.get_executable(), cmd,
- None, None, False, 0, None, None, None)
+ python_exe, cmd,
+ env, None, False, 0, None, None, None)
_winapi.CloseHandle(ht)
except:
_winapi.CloseHandle(rhandle)