This release contains a large amount of new features, while consolidating what we have with many bug fixes. Scalability should be dramatically better, as well as new optimization that will accelerate some code quite a bit. See the summary, how this release is paving the way forward.
Python3: Fix, bytes.decode
with only errors
argument given was not working. Fixed in 0.9.1 already.
MSYS2: Fix, the accelerate mode .cmd
file was not working correctly. Fixed in 0.9.1 already.
Onefile: Fix, the bootstrap when waiting for the child, didn’t protect against signals that interrupt this call. This only affected users of the non-public --onefile-tempdir
option on Linux, but with that becoming the default in 1.0, this was discovered. Fixed in 0.9.1 already.
Fix, pkg_resources
compile time generated Distribution
values could cause issues with code that put it into calls, or in tried blocks. Fixed in 0.9.1 already.
Standalone: Added implicit dependencies of Xlib
package. Fixed in 0.9.1 already.
macOS: Fix, the package configuration for wx
had become invalid when restructuring the Yaml with code and schema disagreeing on allowed values. Fixed in 0.9.1 already.
Fix: The str.format
with a single positional argument didn’t generate proper code and failed to compile on the C level. Fixed in 0.9.1 already.
Fix, the type shape of str.count
result was wrong. Fixed in 0.9.1 already.
UI: Fix, the warning about collision of just compiled package and original package in the same folder hiding the compiled package should not apply to packages without an __init__.py
file, as those do not take precedence. Fixed in 0.9.2 already.
Debugging: Fix, the fallback to lldb
from gdb
when using the option --debugger
was broken on anything but Windows. Fixed in 0.9.2 already.
Python3.8: The module importlib.metadata
was not recognized before 3.9, but actually 3.8 already has it, causing the compile time resolution of package versions to not work there. Fixed in 0.9.3 already.
Standalone: Fix, at least on macOS we should also scan from parent folders of DLLs, since they may contain sub-directories in their names. This is mostly the case, when using frameworks. Fixed in 0.9.2 already.
Standalone: Added package configuration for PyQt5
to require onefile bundle mode on macOS, and recommend to disable console for PyQt6. This is same as we already do for PySide2
and PySide6
. Fixed in 0.9.2 already.
Standalone: Removed stray macOS onefile bundle package configuration for pickle
module which must have been added in error. Fixed in 0.9.2 already.
UI: Catch user error of attempting to compile the __init__.py
rather than the package directory. Fixed in 0.9.2 already.
Fix, hard name import nodes failed to clone, causing issues in optimization phase. Fixed in 0.9.2 already.
Fix, avoid warnings given with gcc 11. Fixed in 0.9.2 already.
Fix, dictionary nodes where the operation itself has no effect, e.g. dict.copy
were not properly annotating that their dictionary argument could still cause a raise and have side effects, triggering an assertion violation in Nuitka. Fixed in 0.9.2 already.
Standalone: Added pynput
implicit dependencies on Linux. Fixed in 0.9.2 already.
Fix, boolean condition checks on variables converted immutable constant value assignments to boolean values, leading to incorrect code execution. Fixed in 0.9.2 already.
Python3.9: Fix, could crash on generic aliases with non-hashable values. Fixed in 0.9.3 already.
non_hashable.py
Python3: Fix, an iteration over sys.version_info
was falsely optimized into a tuple, which is not always compatible. Fixed in 0.9.3 already.
Standalone: Added support for xgboost
package. Fixed in 0.9.3 already.
Standalone: Added data file for text_unidecode
package. Fixed in 0.9.4 already.
Standalone: Added data files for swagger_ui_bundle
package. Fixed in 0.9.4 already.
Standalone: Added data files for connexion
package. Fixed in 0.9.4 already.
Standalone: Added implicit dependencies for sklearn.utils
and rapidfuzz
. Fixed in 0.9.4 already.
Python3.10: Fix, the reformulation of match
statements could create nodes that are used twice, causing code generation to assert. Fixed in 0.9.4 already.
Fix, module objects removed from sys.modules
but still used could lack a reference to themselves, and therefore crash due to working on a released module variables dictionary. Fixed in 0.9.5 already.
Fix, the MSVC compiles code generated for SciPy 1.8 wrongly. Added a workaround for that code to avoid triggering it. Fixed in 0.9.6 already.
Fix, calls to str.format
where the result is not used, could crash the compiler during code generation. Fixed in 0.9.6 already.
Standalone: For DLLs on macOS and Anaconda, also consider the lib
directory of the root environment, as some DLLs are otherwise not found.
Fix, allow nonlocal
and global
for __class__
to be used on the class level.
Fix, xrange
with large values didn’t work on all platforms. This affected at least Python2 on macOS, but potentially others as well.
Windows: When scanning for installed Pythons to e.g. run Scons or onefile compression, it was attempting to use installations that got deleted manually and could crash.
macOS: Fix, DLL conflicts are now resolved by checking the version information too, also all cases that previously errored out after a conflict was reported, will now work.
Fix, conditional expressions whose statically decided condition picking a branch will raise an exception could crash the compilation.
crash.py
Windows: Make sure we set C level standard file handles too At least newer subprocess was affected by this, being unable to provide working handles to child processes that pass their current handles through, and also this should help DLL code to use it as level.
Standalone: Added support for pyqtgraph
data files.
Standalone: Added support for dipy
by anti-bloat removal of its testing framework that wants to do unsupported stuff.
UI: Could still give warnings about modules not being followed, where that was not true.
Fix, --include-module
was not working for non-automatic standard library paths.
Onefile: Recognize a non-changing path from --onefile-tempdir-spec
and then use cached mode. By default a temporary folder is used in the spec value, make it delete the files afterwards.
The cached mode is not necessarily faster, but it is not going to change files already there, leaving the binaries there intact. In the future it may also become faster to execute, but right now checking the validity of the file takes about as long as re-creating it, therefore no gain yet. The main point, is to not change where it runs from.
Standalone: Added option to exclude DLLs. You can npw use --noinclude-dlls
to exclude DLLs by filename patterns.
The may e.g. come from Qt plugins, where you know, or experimented, that it is not going to be used in your specific application. Use with care, removing DLLs will lead to very hard to recognize errors.
Anaconda: Use CondaCC
from environment variables for Linux and macOS, in case it is installed. This can be done with e.g. conda install gcc_linux-64
on Linux or conda install clang_osx-64
on macOS.
Added new option --nowarn-mnemonic
to disable warnings that use mnemonics, there is currently not that many yet, but it’s going to expand. You can use this to acknowledge the ones you accept, and not get that warning with the information pointer anymore.
Added method for resolving DLL conflicts on macOS too. This is using version information and picks the newer one where possible.
Added option --user-package-configuration-file
for user provided Yaml files, which can be used to provide package configuration to Nuitka, to e.g. add DLLs, data files, do some anti-bloat work, or add missing dependencies locally. The documentation for this does not yet exist though, but Nuitka contains a Yaml schema in the misc/nuitka-package-config-schema.json
file.
Added nuitka-project-else
to avoid repeating conditions in Nuitka project configuration, this can e.g. be used like this:
nuitka-project-else.yaml
Previously, the inverted condition had to be used in another nuitka-project-if
which is no big deal, but less readable.
Added support for deep copying uncompiled functions. There is now a section in the User Manual that explains how to clone compiled functions. This allows a workaround like this:
clone.py
Plugins: Added explicit deprecation status of a plugin. We now have a few that do nothing, and are just there for compatibility with existing users, and this now informs the user properly rather than just saying it is not relevant.
Fix, some Python installations crash when attempting to import modules, such as os
with a ModuleName
object, because we limit string operations done, and e.g. refuse to do .startswith
which of course, other loaders that your installation has added, might still use.
Windows: In case of not found DLLs, we can still examine the run time of the currently compiling Python process of Nuitka, and locate them that way, which helps for some Python configurations to support standalone, esp. to find CPython DLL in unusual spots.
Debian: Workaround for lib2to3
data files. These are from stdlib and therefore the patched code from Debian needs to be undone, to make these portable again.
>=
into not <
effectively. Of course this can only be done for types, where we know that nothing special, i.e. no method overloads of __gte__
is going on.long_a + float_b
is actually computed as float_b + long_a
. This again avoids many helpers. It also can be done for *
with integers and container types.nuitka_bool
which is now only used when necessary, because it can indicate the exception result.setuptools_scm
, nose
and nose2
package removals and warnings. There was also a focus on making mmvc
, tensorflow
and tifffile
compile well, removing e.g. the uses of the tensorflow testing framework.int
values with constant values, this uses helpers that work with C long
values that represent a single “digit” of a value, or ones that use the full value space of C long
.float
values with constant values, this uses helpers that work with C float
values, avoiding the useless Python level constant objects.int
and long
now has specialized helpers that avoids converting the int
to a long
through coercion. This takes advantage of code to compare C long
values (which are at the core of Python2 int
objects, with long
objects.)int * bytes
the slot of the first function was still considered, and called to give a Py_NotImplemented
return value for no good reason. This also applies to mixed operations of int
, long
, and float
types, and for str
and unicode
values on Python2.**
operation with floats, this had been overlooked so far.ctypes.CDLL
which aims to allow us to detect used DLLs at compile time in the future, and to move closer to support its bindings more efficiently.dict.popitem
as well. With this, now all of the dictionary methods are specialized.str.expandtabs
, str.translate
, str.ljust
, str.rjust
, str.center
, str.zfill
, and str.splitlines
. While these are barely performance relevant, this completes all str
methods, except removeprefix
and removesuffix
that are Python3.9 or higher.str.index
operation as well, this was missing so far.str
, bytes
and dict
method calls through variables.str
built-in annotate its value as derived from str
, which unfortunately does not allow much optimization, since that can still change many things, but it was still a missing attribute.options-nanny
that is always enabled, giving also much cleaner Yaml configuration with a new section added specifically for these. It controls advice on the optional or required use of --disable-console
and the like. Some packages, e.g. wx
are known to crash on macOS when the console is enabled, so this advice is now done with saner configuration.when
field, that allows checking Python version, OS, Nuitka modes such as standalone, and only apply configuration when matching this criterion, with that the anti-bloat options to allow certain bloat, should now have proper effect as well.AppImage
on Linux is no more. The performance for startup was always slower, while having lost the main benefit of avoiding IO at startup, due to new cached mode, so now we always use the same bootstrap binary as on macOS and Windows.python -m nuitka --version
output is really required for support to given.ccache
binary if installed on non-Windows. This is esp. handy on macOS, where it is harder to get it.implicit-imports
dependency section in the Yaml package configuration a list, for consistency with other blocks.python39_or_higher
, before_python39
), the usage of Anaconda (anaconda
) or certain OS (e.g. macos
), or modes (e.g. standalone
), expressions in when
can limit a configuration item.ruamel.yaml
.cmd.exe
didn’t find a proper path for shell from the git
location.--noinclude-matplotlib
from numpy plugin, as it hasn’t had an effect for a long time now.