Changelog for PyInstaller

4.1 (2020-11-18)

Features

  • Add support for Python 3.9. (#5289)
  • Add support for Python 3.8. (#4311)

Bugfix

  • 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)

Hooks

  • 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 programm.
  • 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 programm.
  • 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 programm.
  • 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.org 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)

Bootloader

  • Fix freeing memory allocted 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)

Documentation

  • 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 python.org 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)

Features

  • 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)

Bugfix

  • (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 base_library.zip. (#4654)
  • Fix FileNotFoundError showing up in utils/misc.py 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.

Hooks

  • 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)

Bootloader

  • Rework bootloader from using strcpy/strncpy with “is this string terminated”-check to use snprintf(); check succes 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)

Documentation

  • 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)

3.6 (2020-01-09)

Important: This is the last release of PyInstaller supporting Python 2.7. Python 2 is end-of-life, many packages are about to drop support for Python 2.7 - or already did it.

Security

  • [SECURITY] (Win32) Fix CVE-2019-16784: Local Privilege Escalation caused by insecure directory permissions of sys._MEIPATH. This security fix effects all Windows software frozen by PyInstaller in “onefile” mode. While PyInstaller itself was not vulnerable, all Windows software frozen by PyInstaller in “onefile” mode is vulnerable.

    If you are using PyInstaller to freeze Windows software using “onefile” mode, you should upgrade PyInstaller and rebuild your software.

Features

  • (Windows): Applications built in windowed mode have their debug messages sent to any attached debugger or DebugView instead of message boxes. (#4288)
  • Better error message when file exists at path we want to be dir. (#4591)

Bugfix

  • (Windows) Allow usage of VSVersionInfo as version argument to EXE again. (#4381, #4539)
  • (Windows) Fix MSYS2 dll’s are not found by modulegraph. (#4125, #4417)
  • (Windows) The temporary copy of bootloader used add resources, icons, etc. is not created in –workpath instead of in %TEMP%. This fixes issues on systems where the anti-virus cleans %TEMP% immediatly. (#3869)
  • Do not fail the build when ldconfig is missing/inoperable. (#4261)
  • Fixed loading of IPython extensions. (#4271)
  • Fixed pre-find-module-path hook for distutils to be compatible with virtualenv >= 16.3. (#4064, #4372)
  • Improve error reporting when the Python library can’t be found. (#4162)

Hooks

  • Add hook for avro (serialization and RPC framework) (#4388), django-babel (#4516), enzyme (#4338), google.api (resp. google.api.core) (#3251), google.cloud.bigquery (#4083, #4084), google.cloud.pubsub (#4446), google.cloud.speech (#3888), nnpy (#4483), passlib (#4520), pyarrow (#3720, #4517), pyexcel and its plugins io, ods, ods3, odsr, xls, xlsx, xlsxw (#4305), pysnmp (#4287), scrapy (#4514), skimage.io (#3934), sklearn.mixture (#4612), sounddevice on macOS and Windows (#4498), text-unidecode (#4327, #4530), the google-cloud-kms client library (#4408), ttkwidgets (#4484), and webrtcvad (#4490).
  • Correct the location of Qt translation files. (#4429)
  • Exclude imports for pkg_resources to fix bundling issue. (#4263, #4360)
  • Fix hook for pywebview to collect all required libraries and data-files. (#4312)
  • Fix hook numpy and hook scipy to account for differences in location of extra dlls on Windows. (#4593)
  • Fix pysoundfile hook to bundle files correctly on both OSX and Windows. (#4325)
  • Fixed hook for pint to also copy metadata as required to retrieve the version at runtime. (#4280)
  • Fixed PySide2.QtNetwork hook by mirroring PyQt5 approach. (#4467, #4468)
  • Hook for pywebview now collects data files and dynamic libraries only for the correct OS (Windows). Hook for pywebview now bundles only the required ‘lib’ subdirectory. (#4375)
  • Update hooks related to PySide2.QtWebEngineWidgets, ensure the relevant supporting files required for a QtWebEngineView are copied into the distribution. (#4377)
  • Update PyQt5 loader to support PyQt >=5.12.3. (#4293, #4332)
  • Update PyQt5 to package 64-bit SSL support DLLs. (#4321)
  • Update PyQt5 to place OpenGL DLLs correctly for PyQt >= 5.12.3. (#4322)
  • (GNU/Linux) Make hook for GdkPixbuf compatible with Ubuntu and Debian (#4486).

Bootloader

  • (OSX): Added support for appending URL to program arguments when applications is launched from custom protocol handler. (#4397, #4399)
  • (POSIX) For one-file binaries, if the program is started via a symlink, the second process now keeps the basename of the symlink. (#3823, #3829)
  • (Windows) If bundled with the application, proactivley load ucrtbase.dll before loading the Python library. This works around unresolved symbol errors when loading python35.dll (or later) on legacy Windows (7, 8, 8.1) systems with Universal CRT update is not installed. (#1566, #2170, #4230)
  • Add our own implementation for strndup and strnlen to be used on pattforms one of these is missing.

PyInstaller Core

  • Now uses hash based .pyc files as specified in PEP 552 in base_library.zip when using Python 3.7 (#4096)

Bootloader build

  • (MinGW-w64) Fix .rc.o file not found error. (#4501, #4586)
  • Add a check whether strndup and strnlen are available.
  • Added OpenBSD support. (#4545)
  • Fix build on Solaris 10.
  • Fix checking for compiler flags in configure phase. The check for compiler flags actually did never work. (#4278)
  • Update url for public key in update-waf script. (#4584)
  • Update waf to version 2.0.19.

3.5 (2019-07-09)

Features

  • (Windows) Force --windowed option if first script is a .pyw file. This might still be overwritten in the spec-file. (#4001)
  • Add support for relative paths for icon-files, resource-files and version-resource-files. (#3333, #3444)
  • Add support for the RedHat Software Collections (SCL) Python 3.x. (#3536, #3881)
  • Install platform-specific dependencies only on that platform. (#4166, #4173)
  • New command-line option --upx-exclude, which allows the user to prevent binaries from being compressed with UPX. (#3821)

Bugfix

  • (conda) Fix detection of conda/anaconda platform.
  • (GNU/Linux) Fix Anaconda Python library search. (#3885, #4015)
  • (Windows) Fix UAC in one-file mode by embedding the manifest. (#1729, #3746)
  • (Windows\Py3.7) Now able to locate pylib when VERSION.dll is listed in python.exe PE Header rather than pythonXY.dll (#3942, #3956)
  • Avoid errors if PyQt5 or PySide2 is referenced by the modulegraph but isn’t importable. (#3997)
  • Correctly parse the --debug=import, --debug=bootloader, and --debug=noarchive command-line options. (#3808)
  • Don’t treat PyQt5 and PySide2 files as resources in an OS X windowed build. Doing so causes the resulting frozen app to fail under Qt 5.12. (#4237)
  • Explicitly specify an encoding of UTF-8 when opening all text files. (#3605)
  • Fix appending the content of datas in a spec files to binaries instead of the internal datas. (#2326, #3694)
  • Fix crash when changing from --onefile to --onedir on consecutive runs. (#3662)
  • Fix discovery of Qt paths on Anaconda. (#3740)
  • Fix encoding error raised when reading a XML manifest file which includes non-ASCII characters. This error inhibited building an executable which has non-ASCII characters in the filename. (#3478)
  • Fix inputs to QCoreApplication constructor in Qt5LibraryInfo. Now the core application’s initialization and finalization in addition to system-wide and application-wide settings is safer. (#4121)
  • Fix installation with pip 19.0. (#4003)
  • Fixes PE-file corruption during version update. (#3142, #3572)
  • In the fake ´site` module set USER_BASE to empty string instead of None as Jupyter Notebook requires it to be a ‘str’. (#3945)
  • Query PyQt5 to determine if SSL is supported, only adding SSL DLLs if so. In addition, search the path for SSL DLLs, instead of looking in Qt’s BinariesPath. (#4048)
  • Require pywin32-ctypes version 0.2.0, the minimum version which supports Python 3.7. (#3763)
  • Use pkgutil instead of filesystem operations for interacting with the modules. (#4181)

Incompatible Changes

  • PyInstaller is no longer tested against Python 3.4, which is end-of-live.
  • Functions compat.architecture(), compat.system() and compat.machine() have been replace by variables of the same name. This avoids evaluating the save several times.
  • Require an option for the --debug argument, rather than assuming a default of all. (#3737)

Hooks

Bootloader

  • Update bundled zlib library to 1.2.11 address vulnerabilities. (#3742)

Documentation

  • Update the text produced by --help to state that the --debug argument requires an option. Correctly format this argument in the Sphinx build process. (#3737)

Project & Process

  • Remove the PEP-518 “build-system” table from pyproject.toml to fix installation with pip 19.0.

PyInstaller Core

  • Add support for folders in COLLECT and BUNDLE. (#3653)
  • Completely remove pywin32 dependency, which has erratic releases and the version on pypi may no longer have future releases. Require pywin32-ctypes instead which is pure python. (#3728, #3729)
  • modulegraph: Align with upstream version 0.17.
  • Now prints a more descriptive error when running a tool fails (instead of dumping a trace-back). (#3772)
  • Suppress warnings about missing UCRT dependencies on Win 10. (#1566, #3736)

Test-suite and Continuous Integration

  • Fix Appveyor failures of test_stderr_encoding() and test_stdout_encoding() on Windows Python 3.7 x64. (#4144)
  • November update of packages used in testing. Prevent pyup from touching test/requirements-tools.txt. (#3845)
  • Rewrite code to avoid a RemovedInPytest4Warning: Applying marks directly to parameters is deprecated, please use pytest.param(..., marks=...) instead.
  • Run Travis tests under Xenial; remove the deprecated sudo: false tag. (#4140)
  • Update the Markdown test to comply with Markdown 3.0 changes by using correct syntax for extensions.