Commit 2a6c2c9b authored by Nick Coghlan's avatar Nick Coghlan

Close #10128: don't rerun __main__.py in multiprocessing

- backports issue #10845's mitigation of incompatibilities between
  the multiprocessing module and directory and zipfile execution
- Multiprocessing on Windows will now automatically skip rerunning top
  level __main__.py modules in spawned processes, rather than failing
  with AssertionError
parent 402803b6
...@@ -470,12 +470,26 @@ def prepare(data): ...@@ -470,12 +470,26 @@ def prepare(data):
process.ORIGINAL_DIR = data['orig_dir'] process.ORIGINAL_DIR = data['orig_dir']
if 'main_path' in data: if 'main_path' in data:
# XXX (ncoghlan): The following code makes several bogus
# assumptions regarding the relationship between __file__
# and a module's real name. See PEP 302 and issue #10845
# The problem is resolved properly in Python 3.4+, as
# described in issue #19946
main_path = data['main_path'] main_path = data['main_path']
main_name = os.path.splitext(os.path.basename(main_path))[0] main_name = os.path.splitext(os.path.basename(main_path))[0]
if main_name == '__init__': if main_name == '__init__':
main_name = os.path.basename(os.path.dirname(main_path)) main_name = os.path.basename(os.path.dirname(main_path))
if main_name != 'ipython': if main_name == '__main__':
# For directory and zipfile execution, we assume an implicit
# "if __name__ == '__main__':" around the module, and don't
# rerun the main module code in spawned processes
main_module = sys.modules['__main__']
main_module.__file__ = main_path
elif main_name != 'ipython':
# Main modules not actually called __main__.py may
# contain additional code that should still be executed
import imp import imp
if main_path is None: if main_path is None:
......
...@@ -55,6 +55,11 @@ Core and Builtins ...@@ -55,6 +55,11 @@ Core and Builtins
Library Library
------- -------
- Issue #10128: backport issue #10845's mitigation of incompatibilities between
the multiprocessing module and directory and zipfile execution.
Multiprocessing on Windows will now automatically skip rerunning __main__ in
spawned processes, rather than failing with AssertionError.
- Issue #25578: Fix (another) memory leak in SSLSocket.getpeercer(). - Issue #25578: Fix (another) memory leak in SSLSocket.getpeercer().
- Issue #25590: In the Readline completer, only call getattr() once per - Issue #25590: In the Readline completer, only call getattr() once per
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment