#----------------------------------------------------------------------------- # Copyright (c) 2022-2023, PyInstaller Development Team. # # Distributed under the terms of the GNU General Public License (version 2 # or later) with exception for distributing the bootloader. # # The full license is in the file COPYING.txt, distributed with this software. # # SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) #----------------------------------------------------------------------------- from PyInstaller import compat from PyInstaller.utils import hooks as hookutils def pre_safe_import_module(api): if compat.is_linux: # RHEL/Fedora RPM package for GObject introspection is known to split the `gi` package into two locations: # - /usr/lib64/python3.x/site-packages/gi # - /usr/lib/python3.x/site-packages/gi # The `__init__.py` is located in the first directory, while `repository` and `overrides` are located in # the second, and `__init__.py` dynamically extends the `__path__` during package import, using # `__path__ = pkgutil.extend_path(__path__, __name__)`. # The modulegraph has no way of knowing this, so we need extend the package path in this hook. Otherwise, # only the first location is scanned, and the `gi.repository` ends up missing. # # NOTE: the `get_package_paths`/`get_package_all_paths` helpers read the paths from package's spec without # importing the (top-level) package, so they do not catch run-time path modifications. Instead, we use # `get_module_attribute` to import the package in isolated process and query its `__path__` attribute. try: paths = hookutils.get_module_attribute(api.module_name, "__path__") except Exception: # Most likely `gi` cannot be imported. paths = [] for path in paths: api.append_package_path(path)