diff options
Diffstat (limited to 'sources/pyside6/PySide6/__init__.py.in')
-rw-r--r-- | sources/pyside6/PySide6/__init__.py.in | 124 |
1 files changed, 124 insertions, 0 deletions
diff --git a/sources/pyside6/PySide6/__init__.py.in b/sources/pyside6/PySide6/__init__.py.in new file mode 100644 index 000000000..d0a4ecc37 --- /dev/null +++ b/sources/pyside6/PySide6/__init__.py.in @@ -0,0 +1,124 @@ +import os +import sys +from pathlib import Path +from textwrap import dedent + +# __all__ is also corrected below. +__all__ = list("Qt" + body for body in + "@all_module_shortnames@" + .split(";")) +__version__ = "@FINAL_PACKAGE_VERSION@" +__version_info__ = (@BINDING_API_MAJOR_VERSION@, @BINDING_API_MINOR_VERSION@, @BINDING_API_MICRO_VERSION@, "@BINDING_API_PRE_RELEASE_VERSION_TYPE@", "@BINDING_API_PRE_RELEASE_VERSION@") + + +def _additional_dll_directories(package_dir): + # Find shiboken6 relative to the package directory. + root = Path(package_dir).parent + # Check for a flat .zip as deployed by cx_free(PYSIDE-1257) + if root.suffix == '.zip': + return [] + shiboken6 = root / 'shiboken6' + if shiboken6.is_dir(): # Standard case, only shiboken6 is needed + return [shiboken6] + # The below code is for the build process when generate_pyi.py + # is executed in the build directory. We need libpyside and Qt in addition. + shiboken6 = Path(root).parent / 'shiboken6' / 'libshiboken' + if not shiboken6.is_dir(): + raise ImportError(str(shiboken6) + ' does not exist') + result = [shiboken6, root / 'libpyside'] + libpysideqml = root / 'libpysideqml' + if libpysideqml.is_dir(): + result.append(libpysideqml) + for path in os.environ.get('PATH').split(';'): + if path: + if (Path(path) / 'qmake.exe').exists(): + result.append(path) + break + return result + + +def _setupQtDirectories(): + # On Windows we need to explicitly import the shiboken6 module so + # that the libshiboken.dll dependency is loaded by the time a + # Qt module is imported. Otherwise due to PATH not containing + # the shiboken6 module path, the Qt module import would fail + # due to the missing libshiboken dll. + # In addition, as of Python 3.8, the shiboken package directory + # must be added to the DLL search paths so that shiboken6.dll + # is found. + # We need to do the same on Linux and macOS, because we do not + # embed rpaths into the PySide6 libraries that would point to + # the libshiboken library location. Importing the module + # loads the libraries into the process memory beforehand, and + # thus takes care of it for us. + + pyside_package_dir = Path(__file__).parent.resolve() + + if sys.platform == 'win32' and sys.version_info[0] == 3 and sys.version_info[1] >= 8: + for dir in _additional_dll_directories(pyside_package_dir): + os.add_dll_directory(os.fspath(dir)) + + try: + # PYSIDE-1497: we use the build dir or install dir or site-packages, whatever the path + # setting dictates. There is no longer a difference in path structure. + from shiboken6 import Shiboken + except Exception: + paths = ', '.join(sys.path) + print(f"PySide6/__init__.py: Unable to import Shiboken from {paths}", + file=sys.stderr) + raise + + if sys.platform == 'win32': + # PATH has to contain the package directory, otherwise plugins + # won't be able to find their required Qt libraries (e.g. the + # svg image plugin won't find Qt5Svg.dll). + os.environ['PATH'] = os.fspath(pyside_package_dir) + os.pathsep + os.environ['PATH'] + + # On Windows, add the PySide6\openssl folder (created by setup.py's + # --openssl option) to the PATH so that the SSL DLLs can be found + # when Qt tries to dynamically load them. Tell Qt to load them and + # then reset the PATH. + openssl_dir = pyside_package_dir / 'openssl' + if openssl_dir.exists(): + path = os.environ['PATH'] + try: + os.environ['PATH'] = os.fspath(openssl_dir) + os.pathsep + path + try: + from . import QtNetwork + except ImportError: + pass + else: + QtNetwork.QSslSocket.supportsSsl() + finally: + os.environ['PATH'] = path + + +def _find_all_qt_modules(): + # Since the wheel split, the __all__ variable cannot be computed statically, + # because we don't know all modules in advance. + + # Instead, we look into the file system and quickly build a list of all + # existing .pyi files, because importing is not desired and also impossible during import. + # By using the initially created list, we can keep some order intact. + location = Path(__file__).resolve().parent + + # Note: We should _not_ call this function while still building, but use the existing value! + in_build = Path("@CMAKE_BINARY_DIR@") in location.parents + + if in_build: + return __all__ + + files = os.listdir(location) + unordered = set(name[:-4] for name in files if name.startswith("Qt") and name.endswith(".pyi")) + ordered_part = __all__ + result = [] + for name in ordered_part: + if name in unordered: + result.append(name) + unordered.remove(name) + result.extend(unordered) + return result + + +__all__ = _find_all_qt_modules() +_setupQtDirectories() |