diff options
author | Steve Dower <steve.dower@microsoft.com> | 2019-01-25 22:59:12 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-01-25 22:59:12 (GMT) |
commit | 4e02f8f8b4baab63f927cfd87b401200ba2969e9 (patch) | |
tree | f3a946b168fc3c72b7b6afda4a164b2d008e096b /Lib | |
parent | 3bab40db96efda2e127ef84e6501fda0cdc4f5b8 (diff) | |
download | cpython-4e02f8f8b4baab63f927cfd87b401200ba2969e9.zip cpython-4e02f8f8b4baab63f927cfd87b401200ba2969e9.tar.gz cpython-4e02f8f8b4baab63f927cfd87b401200ba2969e9.tar.bz2 |
bpo-35797: Fix default executable used by the multiprocessing module (GH-11676)
Diffstat (limited to 'Lib')
-rw-r--r-- | Lib/multiprocessing/spawn.py | 9 | ||||
-rw-r--r-- | Lib/test/test_venv.py | 13 |
2 files changed, 21 insertions, 1 deletions
diff --git a/Lib/multiprocessing/spawn.py b/Lib/multiprocessing/spawn.py index 73aa694..860fa4c 100644 --- a/Lib/multiprocessing/spawn.py +++ b/Lib/multiprocessing/spawn.py @@ -29,12 +29,19 @@ __all__ = ['_main', 'freeze_support', 'set_executable', 'get_executable', if sys.platform != 'win32': WINEXE = False WINSERVICE = False + _WINENV = False else: - WINEXE = (sys.platform == 'win32' and getattr(sys, 'frozen', False)) + WINEXE = getattr(sys, 'frozen', False) WINSERVICE = sys.executable.lower().endswith("pythonservice.exe") + _WINENV = '__PYVENV_LAUNCHER__' in os.environ if WINSERVICE: _python_exe = os.path.join(sys.exec_prefix, 'python.exe') +elif _WINENV: + # bpo-35797: When running in a venv, we need to bypass the redirect + # executor and launch our base Python. + import _winapi + _python_exe = _winapi.GetModuleFileName(0) else: _python_exe = sys.executable diff --git a/Lib/test/test_venv.py b/Lib/test/test_venv.py index 22a3b78..34c2234 100644 --- a/Lib/test/test_venv.py +++ b/Lib/test/test_venv.py @@ -306,6 +306,19 @@ class BasicTest(BaseTest): ) self.assertEqual(out.strip(), '0') + def test_multiprocessing(self): + """ + Test that the multiprocessing is able to spawn. + """ + rmtree(self.env_dir) + self.run_with_capture(venv.create, self.env_dir) + envpy = os.path.join(os.path.realpath(self.env_dir), + self.bindir, self.exe) + out, err = check_output([envpy, '-c', + 'from multiprocessing import Pool; ' + + 'print(Pool(1).apply_async("Python".lower).get(3))']) + self.assertEqual(out.strip(), "python".encode()) + @skipInVenv class EnsurePipTest(BaseTest): """Test venv module installation of pip.""" |