Changelog for PyInstaller

5.10.0 (2023-04-11)


  • (Linux) Ignore the executable name resolution based on /proc/self/exe when the PyInstaller-frozen executable is launched via the dynamic loader executable. In such cases, the resolved name points to the executable, causing the PyInstaller-frozen executable to fail with Cannot open PyInstaller archive from executable… error. (#7551)

  • Ensure that binaries that are manually specified in the .spec file (or via corresponding --add-binary or --collect-binaries command-line switches) undergo the binary dependency analysis, so their dependencies are automatically collected. (#7522)

  • Extend the excludedimports mechanism rework from #7066 to properly handle relative imports within the package. For example, ensure that excludedimports = ['a.b'] within the hook for package a takes effect when package a does from . import b (in addition to from a import b). (#7495)

  • Extend the excludedimports mechanism rework from #7066 to properly handle the case of multiple submodules being imported in a single from ... import ... statement (using absolute or relative import). For example, when package c does from d import e, f, we need to consider potential excludedimports rules matching package d and, if d itself is not excluded, potential rules individually matching d.e and d.f. (#7495)

  • Fix marshal error in binary dependency search stage, caused by the list of collected packages containing a modulegraph.Alias instance instead of only plain str instances. (#7515)

  • Reorganize the multiprocessing run-time hook to override Popen implementations only for spawn and forkserver start methods, but not for the fork start method. This avoids a dead-lock when attempting to perform nested multiprocessing using the fork start method, which occurred due to override-provided lock (introduced in #7411) being copied in its locked state into the forked sub-process. (#7494)

Incompatible Changes

  • The archive_viewer utility has been rewritten with modified command-line interface (--log has been renamed to --list) and with changed output formatting. (#7518)


  • (Windows) Improve support for matplotlib >= 3.7.0 by collecting all delvewheel-generated files from the matplotlib.libs directory, including the load-order file. This is required when PyPI matplotlib wheels are used in combination with Anaconda python 3.8 and 3.9. (#7503)

  • Add hook for PyQt6.QtSpatialAudio module, which was added in PyQt6 6.5.0. (#7549)

  • Add hook for PyQt6.QtTextToSpeech module, which was added in PyQt6 6.4 series. (#7549)

  • Extend PySide6 hooks for PySide6 6.5.0 compatibility: add hooks for QtLocation, QtTextToSpeech, and QtSerialBus modules that were introduced in PySide 6.5.0. (#7549)


  • Clarify the supported color specification formats and apply consistent formatting of default parameter values in the splash screen documentation. (#7529)

5.9.0 (2023-03-13)



5.8.0 (2023-02-11)


  • Compile the collected GLib schema files using glib-schema-compiler instead of collecting the pre-compiled gschemas.compiled file, in order to properly support collection of schema files from multiple locations. Do not collect the source schema files anymore, as only gschemas.compiled file should be required at run time. (#7394)


  • (Cygwin) Avoid using Windows-specific codepaths that require pywin32-ctypes functionality that is not available in Cygwin environment. (#7382)

  • (non-Windows) Fix race condition in environment modification done by multiprocessing runtime hook when multiple threads concurrently spawn processes using the spawn method. (#7410)

  • (Windows) Changes in the version info file now trigger rebuild of the executable file. (#7338)

  • Disallow empty source path in the binaries and datas tuples that are returned from the hooks and sanitized in the PyInstaller.building.utils.format_binaries_and_datas. The empty source path is usually result of an error in the hook’s path retrieval code, and causes implicit collection of the whole current working directory. This is never the intended behavior, so raise a SystemExit. (#7384)

  • Fix unknown log level error raised with --log-level=DEPRECATION. (#7413)

Incompatible Changes

  • The deprecated PEP-302 find_module() and load_module() methods have been removed from PyInstaller’s FrozenImporter. These methods have not been used by python’s import machinery since python 3.4 and PEP-451, and were effectively left untested and unmaintained. The removal affects 3rd party code that still relies on PEP-302 finder/loader methods instead of the PEP-451 ones. (#7344)


  • Collect multimedia plugins that are required by QtMultimedia module starting with Qt6 v6.4.0. (#7352)

  • Do not collect designer plugins as part of QtUiTools module in PySide2 and PySide6 bindings. Instead, tie the collection of plugins only to the QtDesigner module. (#7322)

Module Loader

  • Remove deprecated PEP-302 functionality from FrozenImporter. The find_module() and load_module() methods are deprecated since python 3.4 in favor of PEP-451 loader. (#7344)

5.7.0 (2022-12-04)


  • Add the package’s location and exact interpreter path to the error message for the check for obsolete and PyInstaller-incompatible standard library back-port packages (enum34 and typing). (#7221)

  • Allow controlling the build log level (--log-level) via a PYI_LOG_LEVEL environment variable. (#7235)

  • Support building native ARM applications for Windows. If PyInstaller is ran on an ARM machine with an ARM build of Python, it will prodice an ARM application. (#7257)


  • (Anaconda) Fix the PyInstaller.utils.hooks.conda.collect_dynamic_libs hook utility function to collect only dynamic libraries, by introducing an additional type check (to exclude directories and symbolic links to directories) and additional suffix check (to include only files whose name matches the following patterns: *.dll, *.dylib, *.so, and *.so.*). (#7248)

  • (Anaconda) Fix the problem with Anaconda python 3.10 on linux and macOS, where all content of the environment’s lib directory would end up collected as data due to additional symbolic link pointing from python3.1 to python3.10. (#7248)

  • (GNU/Linux) Fixes an issue with gi shared libraries not being packaged if they don’t have version suffix and are in a special location set by LD_LIBRARY_PATH instead of a typical library path. (#7278)

  • (Windows) Fix the problem with windowed frozen application being unable to spawn interactive command prompt console via subprocess module due to interference of the subprocess runtime hook with stream handles. (#7118)

  • (Windows) In windowed/noconsole mode, stop setting sys.stdout and sys.stderr to custom NullWriter object, and instead leave them at None. This matches the behavior of windowed python interpreter (pythonw.exe) and prevents interoperability issues with code that (rightfully) expects the streams to be either None or objects that are fully compatible with io.IOBase. (#3503)

  • Ensure that module is collected for PySide6 6.4.0 and later in order to enable continued support for | and & operators between Qt key and key modifier enum values (e.g., QtCore.Qt.Key_D and QtCore.Qt.AltModifier). (#7249)

  • Fix potential duplication of python extension modules in onefile builds, which happened when an extension was collected both as an EXTENSION and as a DATA (or a BINARY) TOC type. This resulted in run-time warnings about files already existing; the most notorious example being WARNING: file already exists but should not: C:\Users\user\AppData\Local\Temp\MEI1234567\torch\_C.cp39-win_amd64.pyd when building onefile applications that use torch. (#7273)

  • Fix spurious attempt at reading the top_level.txt metadata from packages installed in egg form. (#7086)

  • Fix the log level (provided via --log-level) being ignored by some build steps. (#7235)

  • Fix the problem with MERGE not properly cleaning up passed Analysis.binaries and Analysis.datas TOCs due to changes made to TOC class in PyInstaller 5.0. This effectively broke the supposed de-duplication functionality of MERGE and multi-package bundles, which should be restored now. (#7273)

  • Prevent $pythonprefix/bin from being added to sys.path when PyInstaller is invoked using pyinstaller but not using python -m PyInstaller This prevents collection mismatch when a library has the same name as console script. (#7120)

  • Prevent isolated-subprocess calls from indefinitely blocking in their clean-up codepath when the subprocess fails to exit. After the grace period of 5 seconds, we now attempt to terminate such subprocess in order to prevent hanging of the build process. (#7290)

Incompatible Changes

  • (Windows) In windowed/noconsole mode, PyInstaller does not set sys.stdout and sys.stderr to custom NullWriter object anymore, but leaves them at None. The new behavior matches that of the windowed python interpreter (pythonw.exe), but may break the code that uses sys.stdout or sys.stderr without first checking that they are available. The code intended to be run frozen in windowed/noconsole mode should be therefore be validated using the windowed python interpreter to catch errors related to console being unavailable. (#7216)


  • Deprecate bytecode encryption (the --key option), to be removed in PyInstaller v6.0. (#6999)


  • (Windows) Remove the subprocess runtime hook. The problem with invalid standard stream handles, which caused the subprocess module raise an OSError: [WinError 6] The handle is invalid error in a windowed onefile frozen application when trying to spawn a subprocess without redirecting all standard streams, has been fixed in the bootloader. (#7182)

  • Ensure that each Qt* submodule of the PySide2, PyQt5, PySide6, and PyQt6 bindings has a corresponding hook, and can therefore been imported in a frozen application on its own. Applicable to the latest versions of packages at the time of writing: PySide2 ==, PyQt5 == 5.15.7, PySide6 == 6.4.0, and PyQt6 == 6.4.0. (#7284)

  • Improve compatibility with contemporary Django 4.x version by removing the override of from the Django run-time hook. The static command list override is both outdated (based on Django 1.8) and unnecessary due to dynamic command list being properly populated under contemporary versions of PyInstaller and Django. (#7259)

  • Introduce additional log messages to matplotlib.backend hook to provide better insight into what backends are selected and why when the detection of matplotlib.use calls comes into effect. (#7300)


  • (Windows) In a onefile application, avoid passing invalid stream handles (the INVALID_HANDLE_VALUE constant with value -1) to the launched application child process when the standard streams are unavailable (for example, in a windowed/no-console application). (#7182)

Bootloader build

  • Support building ARM native binaries using MSVC using the command python waf --target-arch=64bit-arm all. If built on an ARM machine, --target-arch=64bit-arm is the default. (#7257)

  • Windows ARM64 bootloaders may now be built using an ARM build of clang with python waf --target-arch=64bit-arm --clang all. (#7257)

5.6.2 (2022-10-31)


  • (Linux, macOS) Fix the regression in shared library collection, where the shared library would end up collected under its fully-versioned .so name (e.g., instead of its originally referenced name (e.g., due to accidental symbolic link resolution. (#7189)

5.6.1 (2022-10-25)


  • (macOS) Fix regression in macOS app bundle signing caused by a typo made in #7180. (#7184)

5.6 (2022-10-23)


  • Add official support for Python 3.11. (Note that PyInstaller v5.5 is also expected to work but has only been tested with a pre-release of Python 3.11.) (#6783)

  • Implement a new hook utility function, collect_delvewheel_libs_directory(), intended for dealing with external shared library in delvewheel-enabled PyPI wheels for Windows. (#7170)


  • (macOS) Fix OpenCV (cv2) loader error in generated macOS .app bundles, caused by the relocation of package’s source .py files. (#7180)

  • (Windows) Improve compatibility with scipy 1.9.2, whose Windows wheels switched to delvewheel, and therefore have shared libraries located in external .libs directory. (#7168)

  • (Windows) Limit the DLL parent path preservation behavior from #7028 to files collected from site-packages directories (as returned by site.getsitepackages() and site.getusersitepackages()) instead of all paths in sys.path, to avoid unintended behavior in corner cases, such as sys.path containing the drive root or user’s home directory. (#7155)

  • Fix compatibility with PySide6 6.4.0, where the deprecated Qml2ImportsPath location key is not available anymore; use the new QmlImportsPath key when it is available. (#7164)

  • Prevent PyInstaller runtime hook for setuptools from attempting to override distutils with setuptools-provided version when setuptools is collected and its version is lower than 60.0. This both mimics the unfrozen behavior and prevents errors on versions between 50.0 and 60.0, where we do not explicitly collect setuptools._distutils. (#7172)

Incompatible Changes

  • (macOS) In generated macOS .app bundles, the collected source .py files are not relocated from Contents/MacOS to Contents/Resources anymore, to avoid issues when the path to a .py file is supposed to resolve to the same directory as adjacent binary extensions. On the other hand, this change might result in regressions w.r.t. bundle signing and/or notarization. (#7180)


  • (Windows) Update the bundled zlib sources to v1.2.13. (#7166)

5.5 (2022-10-08)


  • (Windows) Support embedding multiple icons in the executable. (#7103)


  • (Windows) Fix a regression introduced in PyInstaller 5.4 (#6925), where incorrect copy of python3.dll (and consequently an additional, incorrect copy of python3X.dll from the same directory) is collected when additional python installations are present in PATH. (#7102)

  • (Windows) Provide run-time override for ctypes.util.find_library that searches sys._MEIPASS in addition to directories specified in PATH. (#7097)

  • Fix the problem with pywin32 DLLs not being found when importing pywin32 top-level extension modules, caused by the DLL directory structure preservation behavior introduced in #7028. Introduce a new bootstrap/loader module that adds the pywin32_system32 directory, if available, to both sys.path and the DLL search paths, in lieu of having to provide a runtime hook script for every single top-level extension module from pywin32. (#7110)


  • Fix an error raised by the matplotlib.backends hook when trying to specify the list of backends to collect via the hooks configuration. (#7091)

5.4.1 (2022-09-11)


  • (Windows) Fix run-time error raised by pyi_rth_win32comgenpy, the run-time hook for win32com. (#7079)

5.4 (2022-09-10)


  • (Windows) When collecting a DLL that was discovered via link-time dependency analysis of a collected binary/extension, attempt to preserve its parent directory structure instead of collecting it into application’s top-level directory. This aims to preserve the parent directory structure of DLLs bundled with python packages in PyPI wheels, while the DLLs collected from system directories (as well as from Library\bin directory of the Anaconda’s environment) are still collected into top-level application directory. (#7028)

  • Add support for setuptools-provided distutils, available since setuptools >= 60.0. (#7075)

  • Implement a generic file filtering decision function for use in hooks, based on the source filename and optional inclusion and exclusion pattern list (PyInstaller.utils.hooks.include_or_exclude_file()). (#7040)

  • Rework the module exclusion mechanism. The excluded module entries, specified via excludedimports list in the hooks, are now used to suppress module imports from corresponding nodes during modulegraph construction, rather than to remove the nodes from the graph as a post-processing step. This should make the module exclusion more robust, but the main benefit is that we avoid running (potentially many and potentially costly) hooks for modules that would end up excluded anyway. (#7066)


  • (Windows) Attempt to extend DLL search paths with directories found in the PATH environment variable and by tracking calls to the os.add_dll_directory function during import of the packages in the isolated sub-process that performs the binary dependency scanning. (#6924)

  • (Windows) Ensure that ANGLE DLLs (libEGL.dll and libGLESv2.dll) are collected when using Anaconda-installed PyQt5 and Qt5. (#7029)

  • Fix AssertionError during build when analysing a .pyc file containing more that 255 variable names followed by an import statement all in the same namespace. (#7055)

Incompatible Changes

  • (Windows) PyInstaller now attempts to preserve parent directory structure of DLLs that are collected from python packages (e.g., bundled with packages in PyPI wheels) instead of collecting them to the top-level application directory. This behavior might be incompatible with 3rd party hooks that assume the old behavior, and may result in duplication of DLL files or missing DLLs in hook-provided runtime search paths. (#7028)


  • Implement new gstreamer hook configuration group with include_plugins and exclude_plugins options that enable control over GStreamer plugins collected by the gi.repository.Gst hook. (#7040)

  • Provide hooks for additional gstreamer modules provided via GObject introspection (gi) bindings: gi.repository.GstAllocators, gi.repository.GstApp, gi.repository.GstBadAudio, gi.repository.GstCheck, gi.repository.GstCodecs, gi.repository.GstController, gi.repository.GstGL, gi.repository.GstGLEGL, gi.repository.GstGLWayland, gi.repository.GstGLX11, gi.repository.GstInsertBin, gi.repository.GstMpegts, gi.repository.GstNet, gi.repository.GstPlay, gi.repository.GstPlayer, gi.repository.GstRtp, gi.repository.GstRtsp, gi.repository.GstRtspServer, gi.repository.GstSdp, gi.repository.GstTranscoder, gi.repository.GstVulkan, gi.repository.GstVulkanWayland, gi.repository.GstVulkanXCB, and gi.repository.GstWebRTC. (#7074)

5.3 (2022-07-30)


  • (Windows) Implement handling of console control signals in the onefile bootloader parent process. The implemented handler suppresses the CTRL_C_EVENT and CTRL_BREAK_EVENT to let the child process deal with them as they see it fit. In the case of CTRL_CLOSE_EVENT, CTRL_LOGOFF_EVENT, or CTRL_SHUTDOWN_EVENT, the handler attempts to delay the termination of the parent process in order to buy time for the child process to exit and for the main thread of the parent process to clean up the temporary directory before exiting itself. This should prevent the temporary directory of a onefile frozen application being left behind when the user closes the console window. (#6591)

  • Implement a mechanism for controlling the collection mode of modules and packages, with granularity ranging from top-level packages to individual sub-modules. Therefore, the hooks can now specify whether the hooked package should be collected as byte-compiled .pyc modules into embedded PYZ archive (the default behavior), or as source .py files collected as external data files (without corresponding modules in the PYZ archive). (#6945)


  • (non-Windows) Avoid generating debug messages in POSIX signal handlers, as the functions involved are generally not signal-safe. Should also fix the endless spam of SIGPIPE that ocurrs under certain conditions when shutting down the frozen application on linux. (#5270)

  • (non-Windows) If the child process of a onefile frozen application is terminated by a signal, delay re-raising of the signal in the parent process until after the clean up has been performed. This prevents onefile frozen applications from leaving behind their unpacked temporary directories when either the parent or the child process is sent the SIGTERM signal. (#2379)

  • When building with noarchive=True (e.g., --debug noarchive or --debug all), PyInstaller no longer pollutes user-writable source locations with its .pyc or .pyo files written next to the corresponding source files. (#6591)

  • When building with noarchive=True (e.g., --debug noarchive or --debug all), the source paths are now stripped from the collected .pyc modules, same as if PYZ archive was used. (#6591)


  • Add PyGObject hook for gi.repository.freetype2. Remove warning for hidden import not found for gi._gobject with PyGObject 3.25.1+. (#6951)

  • Remove pkg_resources hidden imports that aren’t available including py2_warn, markers, and _vendor.pyparsing.diagram. (#6952)


  • Document the signal handling behavior Windows and various quirks related to the frozen application shutdown via the Task Manager. (#6935)

5.2 (2022-07-08)


  • Detect if an icon file (.ico or .icns) is of another image type but has been mislabelled as a native icon type via its file suffix then either normalise to a genuinely native image type if pillow is installed or raise an error. (#6870)

  • Exit gracefully with an explanatory SystemExit if the user moves or deletes the application whilst it’s still running. Note that this is only detected on trying to load a module which has not already been loaded. (#6856)

  • Implement new standard hook variable, called warn_on_missing_hiddenimports. This optional boolean flag allows a hook to opt out from warnings generated by missing hidden imports originating from that hook. (#6914)


  • (Linux) Fix potential mismatch between the collected Python shared library name and the name expected by the bootloader when using Anaconda environment. The mismatch would occur on some attempts to freeze a program that uses an extension that is also linked against the python shared library. (#6831)

  • (Linux) Fix the missing gi.repository error in an application frozen on RHEL/Fedora linux with GObject introspection installed from the distribution’s RPM package. (#6780)

  • (macOS) The QtWebEngine hook now makes QtOpenGL and QtDBus available to the renderer process with framework installs of Qt 6. (#6892)

  • (Windows) Optimize EXE PE headers fix-up process in an attempt to reduce the processing time and the memory footprint with large onefile builds. (#6874)

  • Add a try/except guard around ctypes.util.find_library() to protect against CPython bug #93094 which leads to a FileNotFoundError. (#6864)

  • Fix regression in PyInstaller v5 where an import of a non-existent GObject introspection (gi) module (for example, an optional dependency) in the program causes a build-time error and aborts the build process. (#6897)

  • If passed a name of an importable module instead of a package, the PyInstaller.utils.hooks.collect_submodules() function now returns a list containing the module’s name, same as it would for a package without submodules. (#6850)

  • Prevent PyInstaller.utils.hooks.collect_submodules() from recursing into sub-packages that are excluded by the function passed via the filter argument. (#6846)

  • The PyInstaller.utils.hooks.collect_submodules() function now excludes un-importable subpackages from the returned modules list. (#6850)


  • (macOS) Disable QtWebEngine sandboxing for Qt6 in the corresponding PySide6 and PyQt6 run-time hooks as a work-around for the QtWebEngineProcess helper process crashing. This is required as of Qt 6.3.1 due to the way PyInstaller collects Qt libraries, but is applied regardless of the used Qt6 version. If you are using an older version of Qt6 and would like to keep the sandboxing, reset the QTWEBENGINE_DISABLE_SANDBOX environment variable at the start of your program, before importing Qt packages. (#6903)

  • Add support for GTK4 by adding dependencies and updating gi.repository.Gtk and gi.repository.Gdk to work with module-versions in hooksconfig for gi. (#6834)

  • Refactor the GObject introspection (gi) hooks so that the processing is performed only in hook loading stage or in the hook() function, but not in the mixture of two. (#6901)

  • Update the GObject introspection (gi) hooks to use newly-introduced GiModuleInfo object to:

    • Check for module availability.

    • Perform typelib data collection; equivalent of old get_gi_typelibs function call.

    • Obtain associated shared library path, equivalent of old get_gi_libdir function call.

    The get_gi_typelibs and get_gi_libdir functions now internally use GiModuleInfo to provide backwards-compatibility for external users. (#6901)

5.1 (2022-05-17)



  • Exclude doctest in the pickle hook. Update PySide2, PySide6, PyQt5, and PyQt6 hooks with hidden imports that were previously pulled in by doctest (that was in turn pulled in by pickle). (#6797)


  • (Windows) Update the bundled zlib sources to v1.2.12. (#6804)

Bootloader build

  • Building on Windows with MSVC no longer falls to bits if the PyInstaller repo is stored in a directory with a long path. (#6806)

5.0.1 (2022-04-25)


  • (Linux) Have glib runtime hook prepend the frozen application’s data dir to the XDG_DATA_DIRS environment variable instead of completely overwriting it. This should fix the case when xdg-open is used to launch a system-installed application (for example, opening an URL in a web browser via the webbrowser module) and no registered applications being found. (#3668)

  • Prevent unactionable errors raised by UPX from terminating the build. (#6757)

  • Restore the pre PyInstaller 5.0 behavior of resolving relative paths to icons as relative to the spec file rather than the current working directory. (#6759)

  • (Windows) Update system DLL inclusion list to allow collection of DLLs from Visual Studio 2012 (VC11) runtime and Visual Studio 2013 (VC12) runtime, as well as the latest version of Visual Studio 2015/2017/2019/2022 (VC14) runtime (14.3). (#6778)


  • Refactor QtWebEngine hooks to support both pure Widget-based and pure QML/Quick-based applications. (#6753)

  • Update PySide6 and PyQt6 hooks for compatibility with Qt 6.3. QtWebEngine on Windows and Linux does not provide the qt.conf file for the helper executable anymore, so we generate our own version of the file in order for QtWebengine -based frozen applications to work. (#6769)

5.0 (2022-04-15)


  • (macOS) App bundles built in onedir mode can now opt-in for argv emulation so that file paths passed from the UI (Open with…) are reflected in sys.argv. (#5908)

  • (macOS) App bundles built in onedir mode can now opt-in for argv emulation so that file paths received in initial drag & drop event are reflected in sys.argv. (#5436)

  • (macOS) The argv emulation functionality is now available as an optional feature for app bundles built in either onefile or onedir mode. (#6089)

  • (Windows) Embed the manifest into generated onedir executables by default, in order to avoid potential issues when user renames the executable (e.g., the manifest not being found anymore due to activation context caching when user renames the executable and attempts to run it before also renaming the manifest file). The old behavior of generating the external manifest file in onedir mode can be re-enabled using the --no-embed-manifest command-line switch, or via the embed_manifest=False argument to EXE() in the .spec file. (#6223)

  • (Wine) Prevent collection of Wine built-in DLLs (in either PE-converted or fake/placeholder form) when building a Windows frozen application under Wine. Display a warning for each excluded Wine built-in DLL. (#6149)

  • Add a PyInstaller.isolated submodule as a safer replacement to PyInstaller.utils.hooks.exec_statement(). (#6052)

  • Improve matching of UPX exclude patterns to include OS-default case sensitivity, the wildcard operator (*), and support for parent directories in the pattern. Enables use of patterns like "Qt*.dll" and "PySide2*.pyd". (#6161)

  • Make the error handing of collect_submodules() configurable. (#6052)


  • (macOS) Fix potential loss of Apple Events during onefile app bundle start-up, when the child process is not yet ready to receive events forwarded by the parent process. (#6089)

  • (Windows) Remove the attempt to load the manifest of a onefile frozen executable via the activation context, which fails with An attempt to set the process default activation context failed because the process default activation context was already set. message that can be observed in debug builds. This approach has been invalid ever since #3746 implemented direct manifest embedding into the onefile executable. (#6203)

  • Fix an import leak when PyInstaller.utils.hooks.get_module_file_attribute() is called with a sub-module or a sub-package name. (#6169)

  • Fix an import leak when PyInstaller.utils.hooks.is_package() is called with a sub-module or a sub-package name. (#6169)

  • Fix import errors when calling get_gi_libdir() during packaging of GTK apps. Enable CI tests of GTK by adding PyGObject dependencies for the Ubuntu builds. (#6300)

  • Issue an error report if a .spec file will not be generated, but command-line options specific to that functionality are given. (#6660)

  • Prevent onefile cleanup from recursing into symlinked directories and just remove the link instead. (#6074)

Incompatible Changes

  • (macOS) App bundles built in onefile mode do not perform argv emulation by default anymore. The functionality of converting initial open document/URL events into sys.argv entries must now be explicitly opted-in, via argv_emulation=True argument to EXE() in the .spec file or via --argv-emulation command-line flag. (#6089)

  • (Windows) By default, manifest is now embedded into the executable in onedir mode. The old behavior of generating the external manifest file can be re-enabled using the --no-embed-manifest command-line switch, or via the embed_manifest=False argument to EXE() in the .spec file. (#6223)

  • Issue an error report if a .spec file will not be generated, but command-line options specific to that functionality are given. (#6660)

  • The PyInstaller.utils.hooks.get_module_attribute() function now returns the actual attribute value instead of its string representation. The external users (e.g., 3rd party hooks) of this function must adjust their handling of the return value accordingly. (#6169)

  • The matplotlib.backends hook no longer collects all available matplotlib backends, but rather tries to auto-detect the used backend(s) by default. The old behavior can be re-enabled via the hook configuration option. (#6024)


  • Rework the matplotlib.backends hook to attempt performing auto-detection of the used backend(s) instead of collecting all available backends. Implement hook configuration option that allows users to switch between this new behavior and the old behavior of collecting all backends, or to manually specify the backend(s) to be collected. (#6024)


  • Change the behaviour of the --no-universal2 flag so that it now assumes the target architecture of the compiler (which may be overridden via the CC environment variable to facilitate cross compiling). (#6096)

  • Refactor Apple Events handling code and move it into a separate source file. (#6089)


  • Add a new section describing Apple Event forwarding behavior on macOS and the optional argv emulation for macOS app bundles, along with its caveats. (#6089)

  • Update documentation on using UPX. (#6161)

PyInstaller Core

  • Drop support for Python 3.6. (#6475)

Bootloader build

4.10 (2022-03-05)


  • (Wine) Prevent collection of Wine built-in DLLs (in either PE-converted or fake/placeholder form) when building a Windows frozen application under Wine. Display a warning for each excluded Wine built-in DLL. (#6622)


  • (Linux) Remove the timeout on objcopy operations to prevent wrongful abortions when processing large executables on slow disks. (#6647)

  • (macOS) Limit the strict architecture validation for collected binaries to extension modules only. Fixes architecture validation errors when a universal2 package has its multi-arch extension modules’ arch slices linked against distinct single-arch thin shared libraries, as is the case with scipy 1.8.0 macOS universal2 wheel. (#6587)

  • (macOS) Remove the 60 seconds timeout for each codesign and lipo operation which caused build abortion when processing huge binaries. (#6644)

  • (Windows) Use a made up (not .exe) suffix for intermediate executable files during the build process to prevent antiviruses from attempting to scan the file whilst PyInstaller is still working on it leading to a PermissionError at build time. (#6467)

  • Fix an attempt to collect a non-existent .pyc file when the corresponding source .py file has st_mtime set to zero. (#6625)


  • Add IPython to the list of excluded packages in the PIL hook in order to prevent automatic collection of IPython when it is not imported anywhere else. This in turn prevents whole matplotlib being automatically pulled in when using PIL.Image. (#6605)


  • Fix detection of 32-bit arm platform when Thumb instruction set is enabled in the compiler. In this case, the ctx.env.DEST_CPU in waf build script is set to thumb instead of arm. (#6532)

4.9 (2022-02-03)


  • Add support for external paths when running pkgutil.iter_modules. Add support for multiple search paths to pkgutil.iter_modules. Correctly handle pkgutil.iter_modules with an empty list. (#6529)

  • Fix finding when Python is installed with pyenv and the python executable is not linked against (#6542)

  • Fix handling of symbolic links in the path matching part of the PyInstaller’s pkgutil.iter_modules replacement/override. (#6537)


  • Add hooks for PySide6.QtMultimedia and PyQt6.QtMultimedia. (#6489)

  • Add hooks for QtMultimediaWidgets of all four supported Qt bindings (PySide2, PySide6, PyQt5, and PySide6). (#6489)

  • Add support for setuptools 60.7.1 and its vendoring of jaraco.text in pkg_resources. Exit with an error message if setuptools 60.7.0 is encountered due to incompatibility with PyInstaller’s loader logic. (#6564)

  • Collect the QtWaylandClient-related plugins to enable Wayland support in the frozen applications using any of the four supported Qt bindings (PySide2, PyQt5, PySide6, and PyQt6). (#6483)

  • Fix the issue with missing QtMultimediaWidgets module when using PySide2.QtMultimedia or PySide6.QtMultimedia in combination with PySide’s true_property feature. (#6489)

4.8 (2022-01-06)


  • (Windows) Set the executable’s build time in PE header to the current time. A custom timestamp can be specified via the SOURCE_DATE_EPOCH environment variable to allow reproducible builds. (#6469)

  • Add strictly unofficial support for the Termux platform. (#6484)

  • Replace the dual-process onedir mode on Linux and other Unix-like OSes with a single-process implementation. This makes onedir mode on these OSes comparable to Windows and macOS, where single-process onedir mode has already been used for a while. (#6407)


  • (macOS) Fix regression in generation of universal2 executables that caused the generated executable to fail codesign strict validation. (#6381)

  • (Windows) Fix onefile extraction behavior when the run-time temporary directory is set to a drive letter. The application’s temporary directory is now created directly on the specified drive as opposed to the current directory on the specified drive. (#6051)

  • (Windows) Fix compatibility issues with python 3.9.8 from, arising from the lack of embedded manifest in the python.exe executable. (#6367)

  • (Windows) Fix stack overflow in pyarmor-protected frozen applications, caused by the executable’s stack being smaller than that of the python interpreter. (#6459)

  • (Windows) Fix the python3.dll shared library not being found and collected when using Python from MS App Store. (#6390)

  • Fix a bug that prevented traceback from uncaught exception to be retrieved and displayed in the windowed bootloader’s error reporting facility (uncaught exception dialog on Windows, syslog on macOS). (#6426)

  • Fix a crash when a onefile build attempts to overwrite an existing onedir build on macOS or Linux (#6418)

  • Fix build errors when a linux shared library (.so) file is collected as a binary on macOS. (#6327)

  • Fix build errors when a Windows DLL/PYD file is collected as a binary on a non-Windows OS. (#6327)

  • Fix handling of encodings when reading the collected .py source files via FrozenImporter.get_source(). (#6143)

  • Fix hook loader function not finding hooks if path has whitespaces. (Re-apply the fix that has been inadvertedly undone during the codebase reformatting.) (#6080)

  • Windows: Prevent invalid handle errors when an application compiled in --windowed mode uses subprocess without explicitly setting stdin, stdout and stderr to either PIPE or DEVNULL. (#6364)


  • (macOS) Add support for Anaconda-installed PyQtWebEngine. (#6373)

  • Add hooks for PySide6.QtWebEngineWidgets and PyQt6.QtWebEngineWidgets. The QtWebEngine support in PyInstaller requires Qt6 v6.2.2 or later, so if an earlier version is encountered, we exit with an error instead of producing a defunct build. (#6387)

  • Avoid collecting the whole QtQml module and its dependencies in cases when it is not necessary (i.e., the application does not use QtQml or QtQuick modules). The unnecessary collection was triggered due to extension modules being linked against the libQt5Qml or libQt6Qml shared library, and affected pure widget-based applications (PySide2 and PySide6 on Linux) and widget-based applications that use QtWebEngineWidgets (PySide2, PySide6, PyQt5, and PyQt6 on all OSes). (#6447)

  • Update numpy hook for compatibility with version 1.22; the hook cannot exclude distutils and numpy.distutils anymore, as they are required by numpy.testing, which is used by some external packages, such as scipy. (#6474)


  • (Windows) Set the bootloader executable’s stack size to 2 MB to match the stack size of the python interpreter executable. (#6459)

  • Implement single-process onedir mode for Linux and Unix-like OSes as a replacement for previously-used two-process implementation. The new mode uses exec() without fork() to restart the bootloader executable image within the same process after setting up the environment (i.e., the LD_LIBRARY_PATH and other environment variables). (#6407)

  • Lock the PKG sideload mode in the bootloader unless the executable has a special signature embedded. (#6470)

  • When user script terminates with an uncaught exception, ensure that the exception data obtained via PyErr_Fetch is normalized by also calling PyErr_NormalizeException. Otherwise, trying to format the traceback via traceback.format_exception fails in some circumstances, and no traceback can be displayed in the windowed bootloader’s error report. (#6426)

Bootloader build

  • The bootloader can be force compiled during pip install by setting the environment variable PYINSTALLER_COMPILE_BOOTLOADER. (#6384)

4.7 (2021-11-10)


  • Fix a bug since v4.6 where certain Unix system directories were incorrectly assumed to exist and resulted in a FileNotFoundError. (#6331)


  • Update sphinx hook for compatibility with latest version (4.2.0). (#6330)


  • (Windows) Explicitly set NTDDI_VERSION=0x06010000 and _WIN32_WINNT=0x0601 when compiling Windows bootloaders to request Windows 7 feature level for Windows headers. The windowed bootloader requires at least Windows Vista feature level, and some toolchains (e.g., mingw cross-compiler on linux) set too low level by default. (#6338)

  • (Windows) Remove the check for the unused windres utility when compiling with MinGW toolchain. (#6339)

  • Replace use of PyRun_SimpleString with PyRun_SimpleStringFlags. (#6332)

4.6 (2021-10-29)


  • Add support for Python 3.10. (#5693)

  • (Windows) Embed the manifest into generated onedir executables by default, in order to avoid potential issues when user renames the executable (e.g., the manifest not being found anymore due to activation context caching when user renames the executable and attempts to run it before also renaming the manifest file). The old behavior of generating the external manifest file in onedir mode can be re-enabled using the --no-embed-manifest command-line switch, or via the embed_manifest=False argument to EXE() in the .spec file. (#6248)

  • (Windows) Respect PEP 239 encoding specifiers in Window’s VSVersionInfo files. (#6259)

  • Implement basic resource reader for accessing on-filesystem resources (data files) via importlib.resources (python >= 3.9) or importlib_resources (python <= 3.8). (#5616)

  • Ship precompiled wheels for musl-based Linux distributions (such as Alpine or OpenWRT) on x86_64 and aarch64. (#6245)


  • (macOS) Ensure that executable pre-processing and post-processing steps (target arch selection, SDK version adjustment, (re)signing) are applied in the stand-alone PKG mode. (#6251)

  • (macOS) Robustify the macOS assembly pipeline to work around the issues with the codesign utility on macOS 10.13 High Sierra. (#6167)

  • (Windows) Fix collection of sysconfig platform-specific data module when using MSYS2/MINGW python. (#6118)

  • (Windows) Fix displayed script name and exception message in the unhandled exception dialog (windowed mode) when bootloader is compiled using the MinGW-w64 toolchain. (#6199)

  • (Windows) Fix issues in onedir frozen applications when the bootloader is compiled using a toolchain that forcibly embeds a default manifest (e.g., the MinGW-w64 toolchain from msys2). The issues range from manifest-related options (e.g., uac-admin) not working to windowed frozen application not starting at all (with the The procedure entry point LoadIconMetric could not be located... error message). (#6196)

  • (Windows) Fix the declared length of strings in the optional embedded product version information resource structure. The declared lengths were twice too long, and resulted in trailing garbage characters when the version information was read using ctypes and winver API. (#6219)

  • (Windows) Remove the attempt to load the manifest of a onefile frozen executable via the activation context, which fails with An attempt to set the process default activation context failed because the process default activation context was already set. message that can be observed in debug builds. This approach has been invalid ever since #3746 implemented direct manifest embedding into the onefile executable. (#6248)

  • (Windows) Suppress missing library warnings for api-ms-win-core-* DLLs. (#6201)

  • (Windows) Tolerate reading Windows VSVersionInfo files with unicode byte order marks. (#6259)

  • Fix sys.executable pointing to the external package file instead of the executable when in package side-load mode (pkg_append=False). (#6202)

  • Fix a runaway glob which caused ctypes.util.find_library("libfoo") to non-deterministically pick any library matching libfoo* to bundle instead of (#6245)

  • Fix compatibility with with MIPS and loongarch64 architectures. (#6306)

  • Fix the FrozenImporter.get_source() to correctly handle the packages’ source files. This in turn fixes missing-source-file errors for packages that use pytorch JIT when the source .py files are collected and available (for example, kornia). (#6237)

  • Fix the location of the generated stand-alone pkg file when using the side-load mode (pkg_append=False) in combination with onefile mode. The package file is now placed next to the executable instead of next to the .spec file. (#6202)

  • When generating spec files, avoid hard-coding the spec file’s location as the pathex argument to the Analysis. (#6254)

Incompatible Changes

  • (Windows) By default, manifest is now embedded into the executable in onedir mode. The old behavior of generating the external manifest file can be re-enabled using the --no-embed-manifest command-line switch, or via the embed_manifest=False argument to EXE() in the .spec file. (#6248)


  • (macOS) Fix compatibility with Anaconda PyQt5 package. (#6181)

  • Add a hook for pandas.plotting to restore compatibility with pandas 1.3.0 and later. (#5994)

  • Add a hook for QtOpenGLWidgets for PyQt6 and PySide6 to collect the new QtOpenGLWidgets module introduced in Qt6 (#6310)

  • Add hooks for QtPositioning and QtLocation modules of the Qt5-based packages (PySide2 and PyQt5) to ensure that corresponding plugins are collected. (#6250)

  • Fix compatibility with PyQt5 5.9.2 from conda’s main channel. (#6114)

  • Prevent potential error in hooks for Qt-based packages that could be triggered by a partial PyQt6 installation. (#6141)

  • Update QtNetwork hook for PyQt6 and PySide6 to collect the new tls plugins that were introduced in Qt 6.2. (#6276)

  • Update the gi.repository.GtkSource hook to accept a module-versions hooksconfig dict in order to allow the hook to be used with GtkSource versions greater than 3.0. (#6267)


  • (Windows) Suppress two snprintf truncation warnings that prevented bootloader from building with winlibs MinGW-w64 toolchain. (#6196)

  • Update the Linux bootloader cross compiler Dockerfile to allow using the official PyPA base images in place of the dockcross ones. (#6245)

4.5.1 (2021-08-06)


  • Fix hook loader function not finding hooks if path has whitespaces. (#6080)

4.5 (2021-08-01)


  • (POSIX) Add exclude_system_libraries function to the Analysis class for .spec files, to exclude most or all non-Python system libraries from the bundle. Documented in new POSIX Specific Options section. (#6022)


  • (Cygwin) Add _MEIPASS to DLL search path to fix loading of python shared library in onefile builds made in cygwin environment and executed outside of it. (#6000)

  • (Linux) Display missing library warnings for “not found” lines in ldd output (i.e., => not found) instead of quietly ignoring them. (#6015)

  • (Linux) Fix spurious missing library warning when points to ldd. (#6015)

  • (macOS) Fix python shared library detection for non-framework python builds when the library path cannot be inferred from imports of the python executable. (#6021)

  • (macOS) Fix the crashes in onedir bundles of tkinter-based applications created using Homebrew python 3.9 and Tcl/Tk 8.6.11. (#6043)

  • (macOS) When fixing executable for codesigning, update the value of vmsize field in the __LINKEDIT segment. (#6039)

  • Downgrade messages about missing dynamic link libraries from ERROR to WARNING. (#6015)

  • Fix a bytecode parsing bug which caused tuple index errors whilst scanning modules which use ctypes. (#6007)

  • Fix an error when rhtooks for pkgutil and pkg_resources are used together. (#6018)

  • Fix architecture detection on Apple M1 (#6029)

  • Fix crash in windowed bootloader when the traceback for unhandled exception cannot be retrieved. (#6070)

  • Improve handling of errors when loading hook entry-points. (#6028)

  • Suppress missing library warning for shiboken2 (PySide2) and shiboken6 (PySide6) shared library. (#6015)

Incompatible Changes

  • (macOS) Disable processing of Apple events for the purpose of argv emulation in onedir application bundles. This functionality was introduced in PyInstaller 4.4 by (#5920) in response to feature requests (#5436) and (#5908), but was discovered to be breaking tkinter-based onedir bundles made with Homebrew python 3.9 and Tcl/Tk 8.6.11 (#6043). As such, until the cause is investigated and the issue addressed, this feature is reverted/disabled. (#6048)


  • Add a hook for to deal with indirect import of jinja2 and the missing template file. (#6010)

  • Simplify the PySide2.QWebEngineWidgets and PyQt5.QWebEngineWidgets by merging most of their code into a common helper function. (#6020)


  • Add a page describing hook configuration mechanism and the currently implemented options. (#6025)

PyInstaller Core

  • Isolate discovery of 3rd-party hook directories into a separate subprocess to avoid importing packages in the main process. (#6032)

Bootloader build

  • Allow statically linking zlib on non-Windows specified via either a --static-zlib flag or a PYI_STATIC_ZLIB=1 environment variable. (#6010)

4.4 (2021-07-13)


  • (macOS) Implement signing of .app bundle (ad-hoc or with actual signing identity, if provided). (#5581)

  • (macOS) Implement support for Apple Silicon M1 (arm64) platform and different targets for frozen applications (thin-binary x86_64, thin-binary arm64, and fat-binary universal2), with build-time arch validation and ad-hoc resigning of all collected binaries. (#5581)

  • (macOS) In onedir windowed (.app bundle) mode, perform an interaction of Apple event processing to convert odoc and GURL events to sys.argv before entering frozen python script. (#5920)

  • (macOS) In windowed (.app bundle) mode, always log unhandled exception information to syslog, regardless of debug mode. (#5890)

  • (Windows) Add support for Python from Microsoft App Store. (#5816)

  • (Windows) Implement a custom dialog for displaying information about unhandled exception and its traceback when running in windowed/noconsole mode. (#5890)

  • Add recursive option to PyInstaller.utils.hooks.copy_metadata(). (#5830)

  • Add --codesign-identity command-line switch to perform code-signing with actual signing identity instead of ad-hoc signing (macOS only). (#5581)

  • Add --osx-entitlements-file command-line switch that specifies optional entitlements file to be used during code signing of collected binaries (macOS only). (#5581)

  • Add --target-arch command-line switch to select target architecture for frozen application (macOS only). (#5581)

  • Add a splash screen that displays a background image and text: The splash screen can be controlled from within Python using the pyi_splash module. A splash screen can be added using the --splash IMAGE_FILE option. If optional text is enabled, the splash screen will show the progress of unpacking in onefile mode. This feature is supported only on Windows and Linux. A huge thanks to @Chrisg2000 for programming this feature. (#4354, #4887)

  • Add hooks for PyQt6. (#5865)

  • Add hooks for PySide6. (#5865)

  • Add option to opt-out from reporting full traceback for unhandled exceptions in windowed mode (Windows and macOS only), via --disable-windowed-traceback PyInstaller CLI switch and the corresponding disable_windowed_traceback boolean argument to EXE() in spec file. (#5890)

  • Allow specify which icon set, themes and locales to pack with Gtk applications. Pass a keyword arg hooksconfig to Analysis.

    a = Analysis([""],
                     "gi": {
                         "icons": ["Adwaita"],
                         "themes": ["Adwaita"],
                         "languages": ["en_GB", "zh_CN"]


  • Automatically exclude Qt plugins from UPX processing. (#4178)

  • Collect distribution metadata automatically. This works by scanning collected Python files for uses of:

    • pkg_resources.get_distribution()

    • pkg_resources.require()

    • importlib.metadata.distribution()

    • importlib.metadata.metadata()

    • importlib.metadata.files()

    • importlib.metadata.version()

    In all cases, the metadata will only be collected if the distribution name is given as a plain string literal. Anything more complex will still require a hook containing PyInstaller.utils.hooks.copy_metadata(). (#5830)

  • Implement support for pkgutil.iter_modules(). (#1905)

  • Windows: Provide a meaningful error message if given an icon in an unsupported Image format. (#5755)


  • (macOS) App bundles built in onedir mode now filter out -psnxxx command-line argument from sys.argv, to keep behavior consistent with bundles built in onefile mode. (#5920)

  • (macOS) Ensure that the macOS SDK version reported by the frozen application corresponds to the minimum of the SDK version used to build the bootloader and the SDK version used to build the Python library. Having the application report more recent version than Python library and other bundled libraries may result in macOS attempting to enable additional features that are not available in the Python library, which may in turn cause inconsistent behavior and UI issues with tkinter. (#5839)

  • (macOS) Remove spurious MacOS/ prefix from CFBundleExecutable property in the generated Info.plist when building an app bundle. (#4413, #5442)

  • (macOS) The drag & drop file paths passed to app bundles built in onedir mode are now reflected in sys.argv. (#5436)

  • (macOS) The file paths passed from the UI (Open with…) to app bundles built in onedir mode are now reflected in sys.argv. (#5908)

  • (macOS) Work around the tkinter UI issues due to problems with dark mode activation: black Tk window with macOS Intel installers from, or white text on bright background with Anaconda python. (#5827)

  • (Windows) Enable collection of additional VC runtime DLLs (msvcp140.dll, msvcp140_1.dll, msvcp140_2.dll, and vcruntime140_1.dll), to allow frozen applications to run on Windows systems that do not have Visual Studio 2015/2017/2019 Redistributable installed. (#5770)

  • Enable retrieval of code object for __main__ module via its associated loader (i.e., FrozenImporter). (#5897)

  • Fix inspect.getmodule() failing to resolve module from stack-frame obtained via inspect.stack(). (#5963)

  • Fix __main__ module being recognized as built-in instead of module. (#5897)

  • Fix a bug in ctypes dependency scanning which caused references to be missed if the preceding code contains more than 256 names or 256 literals. (#5830)

  • Fix collection of duplicated _struct and zlib extension modules with mangled filenames. (#5851)

  • Fix python library lookup when building with RH SCL python 3.8 or later. (#5749)

  • Prevent PyInstaller.utils.hooks.copy_metadata() from renaming [...].dist-info metadata folders to [...].egg-info which breaks usage of pkg_resources.requires() with extras. (#5774)

  • Prevent a bootloader executable without an embedded CArchive from being misidentified as having one, which leads to undefined behavior in frozen applications with side-loaded CArchive packages. (#5762)

  • Prevent the use of sys or os as variables in the global namespace in frozen script from affecting the ctypes hooks thar are installed during bootstrap. (#5797)

  • Windows: Fix EXE being rebuilt when there are no changes. (#5921)


    • Add PostGraphAPI.analysis attribute. Hooks can access the Analysis object through the hook() function.

    • Hooks may access a Analysis.hooksconfig attribute assigned on Analysis construction.

      A helper function get_hook_config() was defined in utils.hooks to get the config. (#5853)

  • Add support for PyQt5 5.15.4. (#5631)

  • Do not exclude setuptools.py27compat and setuptools.py33compat as they are required by other setuptools modules. (#5979)

  • Switch the library search order in ctypes hooks: first check whether the given name exists as-is, before trying to search for its basename in sys._MEIPASS (instead of the other way around). (#5907)


  • (macOS) Build bootloader as universal2 binary by default (can be disabled by passing --no-universal2 to waf). (#5581)

  • Add Tcl/Tk based Splash screen, which is controlled from within Python. The necessary module to create the Splash screen in PyInstaller is under Splash available. A huge thanks to @Chrisg2000 for programming this feature. (#4887)

  • Provide a Dockerfile to build Linux bootloaders for different architectures. (#5995)


  • Document the new macOS multi-arch support and code-signing behavior in corresponding sub-sections of Notes about specific Features. (#5581)

Bootloader build

  • Update clang in linux64 Vagrant VM to clang-11 from so it can build universal2 macOS bootloader. (#5581)

  • Update crossosx Vagrant VM to build the toolchain from Command Line Tools for Xcode instead of full Xcode package. (#5581)

4.3 (2021-04-16)


  • Provide basic implementation for FrozenImporter.get_source() that allows reading source from .py files that are collected by hooks as data files. (#5697)

  • Raise the maximum allowed size of CArchive (and consequently onefile executables) from 2 GiB to 4 GiB. (#3939)

  • The unbuffered stdio mode (the u option) now sets the Py_UnbufferedStdioFlag flag to enable unbuffered stdio mode in Python library. (#1441)

  • Windows: Set EXE checksums. Reduces false-positive detection from antiviral software. (#5579)

  • Add new command-line options that map to collect functions from hookutils: --collect-submodules, --collect-data, --collect-binaries, --collect-all, and --copy-metadata. (#5391)

  • Add new hook utility collect_entry_point() for collecting plugins defined through setuptools entry points. (#5734)


  • (macOS) Fix Bad CPU type in executable error in helper-spawned python processes when running under arm64-only flavor of Python on Apple M1. (#5640)

  • (OSX) Suppress missing library error messages for system libraries as those are never collected by PyInstaller and starting with Big Sur, they are hidden by the OS. (#5107)

  • (Windows) Change default cache directory to LOCALAPPDATA (from the original APPDATA). This is to make sure that cached data doesn’t get synced with the roaming profile. For this and future versions AppData\Roaming\pyinstaller might be safely deleted. (#5537)

  • (Windows) Fix onefile builds not having manifest embedded when icon is disabled via --icon NONE. (#5625)

  • (Windows) Fix the frozen program crashing immediately with Failed to execute script pyiboot01_bootstrap message when built in noconsole mode and with import logging enabled (either via --debug imports or --debug all command-line switch). (#4213)

  • CArchiveReader now performs full back-to-front file search for MAGIC, allowing pyi-archive_viewer to open binaries with extra appended data after embedded package (e.g., digital signature). (#2372)

  • Fix MERGE() to properly set references to nested resources with their full shared-package-relative path instead of just basename. (#5606)

  • Fix onefile builds failing to extract files when the full target path exceeds 260 characters. (#5617)

  • Fix a crash in pyi-archive_viewer when quitting the application or moving up a level. (#5554)

  • Fix extraction of nested files in onefile builds created in MSYS environments. (#5569)

  • Fix installation issues stemming from unicode characters in file paths. (#5678)

  • Fix the build-time error under python 3.7 and earlier when ctypes is manually added to hiddenimports. (#3825)

  • Fix the return code if the frozen script fails due to unhandled exception. The return code 1 is used instead of -1, to keep the behavior consistent with that of the python interpreter. (#5480)

  • Linux: Fix binary dependency scanner to support changes to ldconfig introduced in glibc 2.33. (#5540)

  • Prevent MERGE (multipackage) from creating self-references for duplicated TOC entries. (#5652)

  • PyInstaller-frozen onefile programs are now compatible with staticx even if the bootloader is built as position-independent executable (PIE). (#5330)

  • Remove dependence on a private function removed in matplotlib 3.4.0rc1. (#5568)

  • Strip absolute paths from .pyc modules collected into to enable reproducible builds that are invariant to Python install location. (#5563)

  • (OSX) Fix issues with pycryptodomex on macOS. (#5583)

  • Allow compiled modules to be collected into (#5730)

  • Fix a build error triggered by scanning ctypes.CDLL('') on certain Linux C compiler combinations. (#5734)

  • Improve performance and reduce stack usage of module scanning. (#5698)


  • Add support for Conda Forge’s distribution of NumPy. (#5168)

  • Add support for package content listing via pkg_resources. The implementation enables querying/listing resources in a frozen package (both PYZ-embedded and on-filesystem, in that order of precedence) via pkg_resources.resource_exists(), resource_isdir(), and resource_listdir(). (#5284)

  • Hooks: Import correct typelib for GtkosxApplication. (#5475)

  • Prevent matplotlib hook from collecting current working directory when it fails to determine the path to matplotlib’s data directory. (#5629)

  • Update pandas hook for compatibility with version 1.2.0 and later. (#5630)

  • Update hook for distutils.sysconfig to be compatible with pyenv-virtualenv. (#5218)

  • Update hook for sqlalchemy to support version 1.4.0 and above. (#5679)

  • Update hook for sysconfig to be compatible with pyenv-virtualenv. (#5018)


  • Implement full back-to-front file search for the embedded archive. (#5511)

  • Perform file extraction from the embedded archive in a streaming manner in order to limit memory footprint when archive contains large files. (#5551)

  • Set the __file__ attribute in the __main__ module (entry-point script) to the absolute file name inside the _MEIPASS. (#5649)

  • Enable cross compiling for FreeBSD from Linux. (#5733)


  • Doc: Add version spec file option for macOS Bundle. (#5476)

  • Update the Run-time Information section to reflect the changes in behavior of __file__ inside the __main__ module. (#5649)

PyInstaller Core

  • Drop support for python 3.5; EOL since September 2020. (#5439)

  • Collect python extension modules that correspond to built-ins into lib-dynload sub-directory instead of directly into bundle’s root directory. This prevents them from shadowing shared libraries with the same basename that are located in a package and loaded via ctypes or cffi, and also declutters the bundle’s root directory. (#5604)


  • No longer collect pyconfig.h and makefile for sysconfig. Instead of get_config_h_filename() and get_makefile_filename(), you should use get_config_vars() which no longer depends on those files. (#5218)

  • The __file__ attribute in the __main__ module (entry-point script) is now set to the absolute file name inside the _MEIPASS (as if script file existed there) instead of just script filename. This better matches the behavior of __file__ in the unfrozen script, but might break the existing code that explicitly relies on the old frozen behavior. (#5649)

4.2 (2021-01-13)


  • Add hooks utilities to find binary dependencies of Anaconda distributions. (#5213)

  • (OSX) Automatically remove the signature from the collected copy of the Python shared library, using codesign --remove-signature. This accommodates both onedir and onefile builds with recent python versions for macOS, where invalidated signature on PyInstaller-collected copy of the Python library prevents the latter from being loaded. (#5451)

  • (Windows) PyInstaller’s console or windowed icon is now added at freeze-time and no longer built into the bootloader. Also, using --icon=NONE allows to not apply any icon, thereby making the OS to show some default icon. (#4700)

  • (Windows) Enable longPathAware option in built application’s manifest in order to support long file paths on Windows 10 v.1607 and later. (#5424)


  • Fix loading of plugin-type modules at run-time of the frozen application: If the plugin path is one character longer than sys._MEIPATH (e.g. “$PWD/p/plugin_1” and “$PWD/dist/main”), the plugin relative-imports a sub-module (of the plugin) and the frozen application contains a module of the same name, the frozen application module was imported. (#4141, #4299)

  • Ensure that spec for frozen packages has submodule_search_locations set in order to fix compatibility with importlib_resources 3.2.0 and later. (#5396)

  • Fix: No rebuild if “noarchive” build-option changes. (#5404)

  • (OSX) Fix the problem with Python shared library collected from recent python versions not being loaded due to invalidated signature. (#5062, #5272, #5434)

  • (Windows) PyInstaller’s default icon is no longer built into the bootloader, but added at freeze-time. Thus, when specifying an icon, only that icon is contained in the executable and displayed for a shortcut. (#870, #2995)

  • (Windows) Fix “toc is bad” error messages when passing a VSVersionInfo as the version parameter to EXE() in a .spec file. (#5445)

  • (Windows) Fix exception when trying to read a manifest from an exe or dll. (#5403)

  • (Windows) Fix the --runtime-tmpdir option by creating paths if they don’t exist and expanding environment variables (e.g. %LOCALAPPDATA%). (#3301, #4579, #4720)


  • (GNU/Linux) Collect xcbglintegrations and egldeviceintegrations plugins as part of Qt5Gui. (#5349)

  • (macOS) Fix: Unable to code sign apps built with GTK (#5435)

  • (Windows) Add a hook for win32ctypes.core. (#5250)

  • Add hook for scipy.spatial.transform.rotation to fix compatibility with SciPy 1.6.0. (#5456)

  • Add hook-gi.repository.GtkosxApplication to fix TypeError with Gtk macOS apps. (#5385)

  • Add hooks utilities to find binary dependencies of Anaconda distributions. (#5213)

  • Fix the Qt5 library availability check in PyQt5 and PySide2 hooks to re-enable support for Qt5 older than 5.8. (#5425)

  • Implement exec_statement_rc() and exec_script_rc() as exit-code returning counterparts of exec_statement() and exec_script(). Implement can_import_module() helper for hooks that need to query module availability. (#5301)

  • Limit the impact of a failed sub-package import on the result of collect_submodules() to ensure that modules from all other sub-packages are collected. (#5426)

  • Removed obsolete pygame hook. (#5362)

  • Update keyring hook to collect metadata, which is required for backend discovery. (#5245)


  • (GNU/Linux) Reintroduce executable resolution via readlink() on /proc/self/exe and preserve the process name using prctl() with PR_GET_NAME and PR_SET_NAME. (#5232)

  • (Windows) Create temporary directories with user’s SID instead of S-1-3-4, to work around the lack of support for the latter in wine. This enables onefile builds to run under wine again. (#5216)

  • (Windows) Fix a bug in path-handling code with paths exceeding PATH_MAX, which is caused by use of _snprintf instead of snprintf when building with MSC. Requires Visual Studio 2015 or later. Clean up the MSC codepath to address other compiler warnings. (#5320)

  • (Windows) Fix building of bootloader’s test suite under Windows with Visual Studio. This fixes build errors when cmocka is present in the build environment. (#5318)

  • (Windows) Fix compiler warnings produced by MinGW 10.2 in order to allow building the bootloader without having to suppress the warnings. (#5322)

  • (Windows) Fix windowed+debug bootloader variant not properly displaying the exception message and traceback information when the frozen script terminates due to uncaught exception. (#5446)

PyInstaller Core

  • (Windows) Avoid using UPX with DLLs that have control flow guard (CFG) enabled. (#5382)

  • Avoid using .pyo module file suffix (removed since PEP-488) in noarchive mode. (#5383)

  • Improve support for PEP-420 namespace packages. (#5354)

  • Strip absolute paths from .pyc modules collected in the CArchive (PKG). This enables build reproducibility without having to match the location of the build environment. (#5380)

4.1 (2020-11-18)


  • Add support for Python 3.9. (#5289)

  • Add support for Python 3.8. (#4311)


  • Fix endless recursion if a package’s __init__ module is an extension module. (#5157)

  • Remove duplicate logging messages (#5277)

  • Fix sw_64 architecture support (#5296)

  • (AIX) Include python-malloc labeled libraries in search for libpython. (#4210)


  • Add exclude_datas, include_datas, and filter_submodules to collect_all(). These arguments map to the excludes and includes arguments of collect_data_files, and to the filter argument of collect_submodules. (#5113)

  • Add hook for difflib to not pull in doctests, which is only required when run as main program.

  • Add hook for distutils.util to not pull in lib2to3 unittests, which will be rearly used in frozen packages.

  • Add hook for heapq to not pull in doctests, which is only required when run as main program.

  • Add hook for multiprocessing.util to not pull in python test-suite and thus e.g. tkinter.

  • Add hook for numpy._pytesttester to not pull in pytest.

  • Add hook for pickle to not pull in doctests and argpargs, which are only required when run as main program.

  • Add hook for PIL.ImageFilter to not pull numpy, which is an optional component.

  • Add hook for setuptools to not pull in numpy, which is only imported if installed, not mean to be a dependency

  • Add hook for zope.interface to not pull in pytest unittests, which will be rearly used in frozen packages.

  • Add hook-gi.repository.HarfBuzz to fix Typelib error with Gtk apps. (#5133)

  • Enable overriding Django settings path by DJANGO_SETTINGS_MODULE environment variable. (#5267)

  • Fix collect_system_data_files to scan the given input path instead of its parent. File paths returned by collect_all_system_data are now relative to the input path. (#5110)

  • Fix argument order in exec_script() and eval_script(). (#5300)

  • Gevent hook does not unnecessarily bundle HTML documentation, __pycache__ folders, tests nor generated .c and .h files (#4857)

  • gevent: Do not pull in test-suite (still to be refined)

  • Modify hook for gevent to exclude test submodules. (#5201)

  • Prevent .pyo files from being collected by collect_data_files when include_py_files is False. (#5141)

  • Prevent output to stdout during module imports from ending up in the modules list collected by collect_submodules. (#5244)

  • Remove runtime hook and fix regular hook for matplotlib’s data to support matplotlib>=3.3.0, fix deprecation warning on version 3.1<= & <3.3, and behave normally for versions <3.1. (#5006)

  • Remove support for deprecated PyQt4 and PySide (#5118, #5126)

  • setuptools: Exclude outdated compat modules.

  • Update sqlalchemy hook to support v1.3.19 and later, by adding sqlalchemy.ext.baked as a hidden import (#5128)

  • Update tkinter hook to collect Tcl modules directory (tcl8) in addition to Tcl/Tk data directories. (#5175)

  • (GNU/Linux) {PyQt5,PySide2}.QtWebEngineWidgets: fix search for extra NSS libraries to prevent an error on systems where /lib64/nss/*.so comes up empty. (#5149)

  • (OSX) Avoid collecting data from system Tcl/Tk framework in tkinter hook as we do not collect their shared libraries, either. Affects only python versions that still use the system Tcl/Tk 8.5. (#5217)

  • (OSX) Correctly locate the tcl/tk framework bundled with official python builds from v.3.6.5 on. (#5013)

  • (OSX) Fix the QTWEBENGINEPROCESS_PATH set in PyQt5.QtWebEngineWidgets rthook. (#5183)

  • (OSX) PySide2.QtWebEngineWidgets: add QtQmlModels to included libraries. (#5150)

  • (Windows) Remove the obsolete python2.4-era _handle_broken_tcl_tk work-around for old virtual environments from the tkinter hook. (#5222)


  • Fix freeing memory allocated by Python using free() instead of PyMem_RawFree(). (#4441)

  • (GNU/Linux) Avoid segfault when temp path is missing. (#5255)

  • (GNU/Linux) Replace a strncpy() call in pyi_path_dirname() with snprintf() to ensure that the resulting string is always null-terminated. (#5212)

  • (OSX) Added capability for already-running apps to accept URL & drag’n drop events via Apple Event forwarding (#5276)

  • (OSX) Bump MACOSX_DEPLOYMENT_TARGET from 10.7 to 10.13. (#4627, #4886)

  • (OSX) Fix to reactivate running app on “reopen” (#5295)

  • (Windows) Use _wfullpath() instead of _fullpath() in pyi_path_fullpath to allow non-ASCII characters in the path. (#5189)


  • Add zlib to build the requirements in the Building the Bootlooder section of the docs. (#5130)

PyInstaller Core

  • Add informative message what do to if RecurrsionError occurs. (#4406, #5156)

  • Prevent a local directory with clashing name from shadowing a system library. (#5182)

  • Use module loaders to get module content instea of an quirky way semming from early Python 2.x times. (#5157)

  • (OSX) Exempt the Tcl/Tk dynamic libraries in the system framework from relative path overwrite. Fix missing Tcl/Tk dynlib on older builds that still make use of the system framework. (#5172)

Test-suite and Continuous Integration

  • Replace skipif_xxx for platform-specific tests by markers. (#1427)

  • Test/CI: Test failures are automatically retried once. (#5214)

Bootloader build

  • Fix AppImage builds that were broken since PyInstaller 3.6. (#4693)

  • Update build system to use Python 3.

  • OSX: Fixed the ineffectiveness of the --distpath argument for the BUNDLE step. (#4892)

  • OSX: Improve codesigning and notarization robustness. (#3550, #5112)

  • OSX: Use high resolution mode by default for GUI applications. (#4337)

4.0 (2020-08-08)


  • Provide setuptools entrypoints to enable other packages to provide PyInstaller hooks specific to that package, along with tests for these hooks.

    Maintainers of Python packages requiring hooks are invited to use this new feature and provide up-to-date PyInstaller support along with their package. This is quite easy, see our sample project for more information (#4232, #4301, #4582). Many thanks to Bryan A. Jones for implementing the important parts.

  • A new package pyinstaller-hooks-contrib provides monthly updated hooks now. This package is installed automatically when installing PyInstaller, but can be updated independently. Many thanks to Legorooj for setting up the new package and moving the hooks there.

  • Added the excludes and includes arguments to the hook utility function collect_data_files.

  • Change the hook collection order so that the hook-priority is command line, then entry-point, then PyInstaller builtins. (#4876)


  • (AIX) Include python-malloc labeled libraries in search for libpython. (#4738)

  • (win32) Fix Security Alerts caused by subtle implementation differences between posix anf windows in os.path.dirname(). (#4707)

  • (win32) Fix struct format strings for versioninfo. (#4861)

  • (Windows) cv2: bundle the opencv_videoio_ffmpeg*.dll, if available. (#4999)

  • (Windows) GLib: bundle the spawn helper executables for g_spawn* API. (#5000)

  • (Windows) PySide2.QtNetwork: search for SSL DLLs in PrefixPath in addition to BinariesPath. (#4998)

  • (Windows) When building with 32-bit python in onefile mode, set the requestedExecutionLevel manifest key every time and embed the manifest. (#4992)

    • (AIX) Fix uninitialized variable. (#4728, #4734)

  • Allow building on a different drive than the source. (#4820)

  • Consider Python<version> as possible library binary path. Fixes issue where python is not found if Python3 is installed via brew on OSX (#4895)

  • Ensure shared dependencies from onefile packages can be opened in the bootloader.

  • Ensuring repeatable builds of (#4654)

  • Fix FileNotFoundError showing up in utils/ which occurs when a namespace was processed as an filename. (#4034)

  • Fix multipackaging. The MERGE class will now have the correct relative paths between shared dependencies which can correctly be opened by the bootloader. (#1527, #4303)

  • Fix regression when trying to avoid hard-coded paths in .spec files.

  • Fix SIGTSTP signal handling to allow typing Ctrl-Z from terminal. (#4244)

  • Update the base library to support encrypting Python bytecode (--key option) again. Many thanks to Matteo Bertini for finally fixing this. (#2365, #3093, #3133, #3160, #3198, #3316, #3619, #4241, #4652)

  • When stripping the leading parts of paths in compiled code objects, the longest possible import path will now be stripped. (#4922)

Incompatible Changes

  • Remove support for Python 2.7. The minimum required version is now Python 3.5. The last version supporting Python 2.7 was PyInstaller 3.6. (#4623)

  • Many hooks are now part of the new pyinstaller-hooks-contrib repository. See below for a detailed list.


  • Add hook for scipy.stats._stats (needed for scipy since 1.5.0). (#4981)

  • Prevent hook-nltk from adding non-existing directories. (#3900)

  • Fix importlib_resources hook for modern versions (after 1.1.0). (#4889)

  • Fix hidden imports in pkg_resources and packaging (#5044)

    • Add yet more hidden imports to pkg_resources hook.

    • Mirror the pkg_resources hook for packaging which may or may not be duplicate of pkg_resources._vendor.packaging.

  • Update pkg_resources hook for setuptools v45.0.0.

  • Add QtQmlModels to included libraries for QtWebEngine on OS X (#4631).

  • Fix detecting Qt5 libraries and dependencies from conda-forge builds (#4636).

  • Add an AssertionError message so that users who get an error due to Hook conflicts can resolve it (#4626).

  • These hooks have been moved to the new pyinstaller-hooks-contrib repository: BTrees, Crypto, Cryptodome, IPython, OpenGL, OpenGL_accelerate, Xlib, accessible_output2, adios, aliyunsdkcore, amazonproduct, appdirs, appy, astor, astroid, astropy, avro, bacon, boto, boto3, botocore, certifi, clr, countrycode, cryptography, cv2, cx_Oracle, cytoolz, dateparser, dclab, distorm3, dns, docutils, docx, dynaconf, enchant, enzyme, eth_abi, eth_account, eth_hash, eth_keyfile, eth_utils, faker, flex, fmpy, gadfly, gooey, google.*, gst, gtk, h5py, httplib, httplib2, imageio, imageio_ffmpeg, jedi, jinja2, jira, jsonpath_rw_ext, jsonschema, jupyterlab, kinterbasdb, langcodes, lensfunpy, libaudioverse, llvmlite, logilab, lxml, lz4, magic, mako, markdown, migrate, mpl_toolkits, mssql, mysql, nacl, names, nanite, nbconvert, nbdime, nbformat, ncclient, netCDF4, nltk, nnpy, notebook, numba, openpyxl, osgeo, passlib, paste, patsy, pendulum, phonenumbers, pint, pinyin, psychopy, psycopg2, pubsub, pyarrow, pycountry, pycparser, pyexcel, pyexcelerate, pylint, pymssql, pyodbc, pyopencl, pyproj, pysnmp, pytest, pythoncom, pyttsx, pywintypes, pywt, radicale, raven, rawpy, rdflib, redmine, regex, reportlab, reportlab, resampy, selenium, shapely, skimage, sklearn, sound_lib, sounddevice, soundfile, speech_recognition, storm, tables, tcod, tensorflow, tensorflow_corethon, text_unidecode, textdistance, torch, ttkthemes, ttkwidgets, u1db, umap, unidecode, uniseg, usb, uvloop, vtkpython, wavefile, weasyprint, web3, webrtcvad, webview, win32com, wx, xml.dom, xml.sax, xsge_gui, zeep, zmq.

  • These hooks have been added while now moved to the new pyinstaller-hooks-contrib repository: astor (#4400, #4704), argon2 (#4625) bcrypt. (#4735), (Bluetooth Low Energy platform Agnostic Klient for Python) (#4649) jaraco.text (#4576, #4632), LightGBM. (#4634), xmldiff (#4680), puremagic (identify a file based off it’s magic numbers) (#4709) webassets (#4760), tensorflow_core (to support tensorflow module forwarding logic (#4400, #4704)

  • These changes have been applied to hooks now moved to the new pyinstaller-hooks-contrib repository

    • Update Bokeh hook for v2.0.0. (#4742, #4746)

    • Fix shapely hook on Windows for non-conda shapely installations. (#2834, #4749)


  • Rework bootloader from using strcpy/strncpy with “is this string terminated”-check to use snprintf(); check success at more places. (This started from fixing GCC warnings for strncpy and strncat.)

  • Fix: When copying files, too much data was copied in most cases. This corrupted the file and inhibited using shared dependencies. (#4303)

  • In debug and windowed mode, show the traceback in dialogs to help debug pyiboot01_bootstrap errors. (#4213, #4592)

  • Started a small test-suite for bootloader basic functions. (#4585)


  • Add platform-specific usage notes and bootloader build notes for AIX. (#4731)

PyInstaller Core

Bootloader build

  • (AIX) The argument -X32 or -X64 is not recognized by the AIX loader - so this code needs to be removed. (#4730, #4731)

  • (OSX) Allow end users to override MACOSX_DEPLOYMENT_TARGET and mmacosx-version-min via environment variables and set 10.7 as the fallback value for both. (#4677)

  • Do not print info about --noconfirm when option is already being used. (#4727)

  • Update waf to version 2.0.20 (#4839)