[Python-checkins] bpo-35797: Fix default executable used by the multiprocessing module (GH-11676)

Steve Dower webhook-mailer at python.org
Fri Jan 25 17:59:18 EST 2019


https://github.com/python/cpython/commit/4e02f8f8b4baab63f927cfd87b401200ba2969e9
commit: 4e02f8f8b4baab63f927cfd87b401200ba2969e9
branch: master
author: Steve Dower <steve.dower at microsoft.com>
committer: GitHub <noreply at github.com>
date: 2019-01-25T14:59:12-08:00
summary:

bpo-35797: Fix default executable used by the multiprocessing module (GH-11676)

files:
A Misc/NEWS.d/next/Windows/2019-01-25-12-29-14.bpo-35797.MzyOK9.rst
M Lib/multiprocessing/spawn.py
M Lib/test/test_venv.py

diff --git a/Lib/multiprocessing/spawn.py b/Lib/multiprocessing/spawn.py
index 73aa69471f29..860fa4ceb5ce 100644
--- a/Lib/multiprocessing/spawn.py
+++ b/Lib/multiprocessing/spawn.py
@@ -29,12 +29,19 @@
 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 22a3b78852f8..34c2234493bc 100644
--- a/Lib/test/test_venv.py
+++ b/Lib/test/test_venv.py
@@ -306,6 +306,19 @@ def test_unicode_in_batch_file(self):
         )
         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."""
diff --git a/Misc/NEWS.d/next/Windows/2019-01-25-12-29-14.bpo-35797.MzyOK9.rst b/Misc/NEWS.d/next/Windows/2019-01-25-12-29-14.bpo-35797.MzyOK9.rst
new file mode 100644
index 000000000000..a0745f500b13
--- /dev/null
+++ b/Misc/NEWS.d/next/Windows/2019-01-25-12-29-14.bpo-35797.MzyOK9.rst
@@ -0,0 +1 @@
+Fix default executable used by the multiprocessing module



More information about the Python-checkins mailing list