diff options
author | Steve Dower <steve.dower@microsoft.com> | 2019-02-04 07:19:38 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-02-04 07:19:38 (GMT) |
commit | a8474d025cab794257d2fd0bea67840779b9351f (patch) | |
tree | 1e2521303b70f42bd63cf1f432513db9cfd04742 /Lib/multiprocessing/popen_spawn_win32.py | |
parent | 2f6fae6e510dba653391cb510a2aca8322eec03b (diff) | |
download | cpython-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.py | 22 |
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) |