summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
authorSteve Dower <steve.dower@microsoft.com>2019-01-25 22:59:12 (GMT)
committerGitHub <noreply@github.com>2019-01-25 22:59:12 (GMT)
commit4e02f8f8b4baab63f927cfd87b401200ba2969e9 (patch)
treef3a946b168fc3c72b7b6afda4a164b2d008e096b /Lib
parent3bab40db96efda2e127ef84e6501fda0cdc4f5b8 (diff)
downloadcpython-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.py9
-rw-r--r--Lib/test/test_venv.py13
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."""