#----------------------------------------------------------------------------- # Copyright (c) 2022, PyInstaller Development Team. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # # The full license is in the file COPYING.txt, distributed with this software. # # SPDX-License-Identifier: Apache-2.0 #----------------------------------------------------------------------------- import sys import os def _setup_pyqtgraph_multiprocess_hook(): # NOTE: pyqtgraph.multiprocess spawns the sub-process using subprocess.Popen (or equivalent). This means that in # onefile builds, the executable in subprocess will unpack itself again, into different sys._MEIPASS, because # the _MEIPASS2 environment variable is not set (bootloader / bootstrap script cleans it up). This will make the # argv[1] check below fail, due to different sys._MEIPASS value in the subprocess. # # To work around this, at the time of writing (PyInstaller 5.5), the user needs to set _MEIPASS2 environment # variable to sys._MEIPASS before using `pyqtgraph.multiprocess` in onefile builds. And stlib's # `multiprocessing.freeze_support` needs to be called in the entry-point program, due to `pyqtgraph.multiprocess` # internally using stdlib's `multiprocessing` primitives. if len(sys.argv) == 2 and sys.argv[1] == os.path.join(sys._MEIPASS, 'pyqtgraph', 'multiprocess', 'bootstrap.py'): # Load as module; this requires --hiddenimport pyqtgraph.multiprocess.bootstrap try: mod_name = 'pyqtgraph.multiprocess.bootstrap' mod = __import__(mod_name) bootstrap_co = mod.__loader__.get_code(mod_name) except Exception: bootstrap_co = None if bootstrap_co: exec(bootstrap_co) sys.exit(0) # Load from file; requires pyqtgraph/multiprocess/bootstrap.py collected as data file bootstrap_file = os.path.join(sys._MEIPASS, 'pyqtgraph', 'multiprocess', 'bootstrap.py') if os.path.isfile(bootstrap_file): with open(bootstrap_file, 'r') as fp: bootstrap_code = fp.read() exec(bootstrap_code) sys.exit(0) raise RuntimeError("Could not find pyqtgraph.multiprocess bootstrap code or script!") _setup_pyqtgraph_multiprocess_hook() del _setup_pyqtgraph_multiprocess_hook