Release Notes¤
1.0.0 (2025-06-09)¤
The 32-bit server is frozen with the following versions
server32-windows.exe
— Python 3.13.4, pythonnet 3.0.5, comtypes 1.4.11server32-linux
— Python 3.13.4
Added:
Client64
now acceptshost=None
which will mock the connection to the serverfreeze32
console script to create a new 32-bit server- support for Python 3.12 and 3.13
- PEP-484 type annotations
Changed:
- convert to an implicit namespace package (PEP-420)
- the
requires_pythonnet
andrequires_comtypes
arguments tofreeze_server32.main()
were removed and theimports
,data
skip_32bit_check
,keep_spec
andkeep_tk
arguments were added - all constants (e.g.,
IS_WINDOWS
) were moved to a (private)_constants.py
file - data type of
EXAMPLES_DIR
and the return type fromServer32.examples_dir()
changed from str to Path
Removed:
- support for Python 2.7, 3.5, 3.6 and 3.7
- the deprecated
quiet
parameter
0.10.0 (2023-06-16)¤
This release will be the last to support Python 2.7, 3.5, 3.6 and 3.7
The 32-bit server is frozen with the following versions
server32-windows.exe
— Python 3.11.4, pythonnet 3.0.1, comtypes 1.2.0server32-linux
— Python 3.11.4 (built with GLIBC 2.27)
Added:
- can now specify the destination directory when freezing the 32-bit server
- the
server32_dir
keyword argument toClient64
(fixes issue #35) - support for Python 3.10 and 3.11
LoadLibrary
andClient64
can now be used as a context manager (with statement)LoadLibrary.cleanup()
method~/.local/share/py4j
to the search paths when looking for thepy4j<version>.jar
file
Changed:
utils.is_port_in_use()
only checks TCP ports and it uses thess
command instead ofnetstat
on linux- the example libraries for FORTRAN now depend on
libgfortran5
on linux
Fixed:
- issue #31 — suppress console popups when using
pythonw.exe
- issue #24 — starting the 32-bit server could block forever by not honouring the timeout
0.9.0 (2021-05-13)¤
The 32-bit server is frozen with the following versions
server32-windows.exe
— Python 3.7.10, pythonnet 2.5.2, comtypes 1.1.10server32-linux
— Python 3.7.10, pythonnet 2.4.0
Added:
- support for loading an ActiveX library
- the following static methods to
Server32
—remove_site_packages_64bit
,is_interpreter
,examples_dir
- the
utils.generate_com_wrapper
function
Changed:
- the
sys.coinit_flags
attribute is now set toCOINIT_MULTITHREADED
(only if this attribute was not already defined prior to importingmsl.loadlib
)
Fixed:
Client64.__del__
could have written a warning to stderr indicating that noself._conn
attribute existedsys:1: ResourceWarning: unclosed file <_io.BufferedReader name=...>
warnings could be written to stderr when aClient64
object is destroyed- issue #23 — the
useLegacyV2RuntimeActivationPolicy
property was no longer created
0.8.0 (2021-02-20)¤
The 32-bit server is frozen with the following versions
server32-windows.exe
— Python 3.7.10, pythonnet 2.5.2 and comtypes 1.1.8server32-linux
— Python 3.7.10 and pythonnet 2.4.0
Added:
- support for Python 3.9
- the
protocol
keyword argument toClient64
- the ability to request non-callable attributes from the 32-bit server class (e.g., methods that use the
@property
decorator and class/instance variables)
Changed:
- call
clr.AddReference
beforeclr.System.Reflection.Assembly.LoadFile
when loading a .NET library - use PIPE's for
stdout
andstderr
for the 32-bit server subprocess and for the py4jGatewayServer
Client64.shutdown_server32
now returns the(stdout, stderr)
streams from the 32-bit server subprocess- the
quiet
keyword argument forClient64
is now deprecated
Fixed:
- issue #21 — an
UnsupportedOperation: fileno
exception was raised when running within the Spyder IDE
Removed:
cygwin
from theIS_WINDOWS
check
0.7.0 (2020-03-17)¤
The 32-bit server is frozen with the following versions
server32-windows.exe
— Python 3.7.7, pythonnet 2.4.0 and comtypes 1.1.7server32-linux
— Python 3.7.7 and pythonnet 2.4.0
Added:
- support for Python 3.8
- compiled the C++ and FORTRAN examples for 64-bit macOS
Changed:
- use
__package__
as the logger name - renamed
utils.port_in_use()
toutils.is_port_in_use()
and added support for checking the status of a port in macOS - changes to how a .NET library is loaded: include the System namespace by default, do not automatically create a class instance
Removed:
- support for Python 3.4
0.6.0 (2019-05-07)¤
The 32-bit server is frozen with the following versions
server32-windows.exe
— Python 3.7.3, pythonnet 2.4.0 and comtypes 1.1.7server32-linux
— Python 3.7.3 and pythonnet 2.4.0
Added:
- a
shutdown_handler()
method toServer32
(PR #19) - a section to the docs that explains how to re-freeze the 32-bit server
- a
kill_timeout
keyword argument toClient64.shutdown_server32()
- the
rpc_timeout
keyword argument toClient64
(thanks to @fake-name) - search
HKEY_CLASSES_ROOT\\Wow6432Node\\CLSID
in the Windows Registry for additional COMProgID
's extras_require
parameter tosetup.py
with keys:clr
,java
,com
,all
Changed:
- rename the optional
-asp
and-aep
command line arguments to be-s
and-e
respectively - the current working directory where the 64-bit Python interpreter was executed from is now automatically appended to
os.environ['PATH']
on the 32-bit server freeze_server32.py
uses anArgumentParser
instead of directly reading fromsys.argv
Fixed:
- use
sys.executable -m PyInstaller
to create the 32-bit server (cherry picked from PR #18) - the 32-bit server prints error messages to
sys.stderr
instead ofsys.stdout
- issue #15 — wait for the subprocess that starts the 32-bit server to terminate and set a value for the
returncode
- issue #14 — use
os.kill
to stop the 32-bit server if it won't stop afterkill_timeout
seconds
0.5.0 (2019-01-06)¤
The 32-bit server is frozen with the following versions
server32-windows.exe
— Python 3.6.8, pythonnet 2.3.0 and comtypes 1.1.7server32-linux
— Python 3.6.8 and pythonnet 2.3.0
Added:
- support for loading a Component Object Model (COM) library on Windows
- the
requires_pythonnet
andrequires_comtypes
kwargs tofreeze_server32.main()
"clr"
as an alias for"net"
for thelibtype
parameter inLoadLibrary
- the
utils.get_com_info()
function - support for unicode paths in Python 2
- examples for working with numpy arrays and C++ structs
Changed:
- if loading a .NET assembly succeeds but calling
GetTypes()
fails then a detailed error message is logged rather than raising the exception - the value oflib
will beNone
- the default timeout value when waiting for the 32-bit server to start is now 10 seconds
- the
Client64
class now raisesServer32Error
if the 32-bit server raises an exception - the
Client64
class now inherits fromobject
and the reference toHTTPConnection
is now a property value - the
__repr__
methods no longer include the id as a hex number
Fixed:
- set
sys.stdout = io.StringIO()
ifquiet=True
on the server
0.4.1 (2018-08-24)¤
The 32-bit server is frozen with the following versions
server32-windows.exe
— Python 3.6.6 and pythonnet 2.3.0server32-linux
— Python 3.6.6 and pythonnet 2.3.0
Added:
- the
version_info
namedtuple now includes a releaselevel - support for Python 3.7
Fixed:
- issue #11
utils.wait_for_server()
raisedNameError: name 'TimeoutError' is not defined
for Python 2.7utils.port_in_use()
raisedUnicodeDecodeError
(PR #9)setup.py
is now also compatible with Sphinx 1.7+
Changed:
- pythonnet is now an optional dependency on Windows and py4j is now optional for all OS
- rename
Dummy
example toEcho
Removed:
- support for Python 3.3
0.4.0 (2018-02-28)¤
The 32-bit server is frozen with the following versions
server32-windows.exe
— Python 3.6.4 and pythonnet 2.3.0server32-linux
— Python 3.6.4 and pythonnet 2.3.0
Added:
- Py4J wrapper for loading
.jar
and.class
Java files - example on how to load a library that was built with LabVIEW
Fixed:
- issue #8
- issue #7
AttributeError("'LoadLibrary' object has no attribute '_lib'")
could be raised in__repr__
Changed:
- rename
DotNetContainer
toDotNet
- use
socket.socket.bind
to select an available port instead of checking of callingutils.port_in_use
- moved the static methods to the
utils
module:- Client64.port_in_use → utils.port_in_use
- Client64.get_available_port → utils.get_available_port
- Client64.wait_for_server → utils.wait_for_server
- LoadLibrary.check_dot_net_config → utils.check_dot_net_config
- LoadLibrary.is_pythonnet_installed → utils.is_pythonnet_installed
0.3.2 (2017-10-18)¤
The 32-bit server is frozen with the following versions
server32-windows.exe
— Python 3.6.3 and pythonnet 2.3.0server32-linux
— Python 3.6.3 and pythonnet 2.3.0
Added:
- include
os.environ['PATH']
as a search path when loading a library - support that the package can now be installed by
pip install msl-loadlib
Fixed:
- remove
sys.getsitepackages()
error for virtualenv (issue #5) RecursionError
when freezing freeze_server32.py with PyInstaller 3.3- replaced
FileNotFoundError
withIOError
(for Python 2.7 support) - recompile
cpp_lib*.dll
andfortran_lib*.dll
to not depend on external dependencies
0.3.1 (2017-05-15)¤
- fix ReadTheDocs build error — AttributeError: module 'site' has no attribute 'getsitepackages'
- strip whitespace from append_sys_path and append_environ_path
- make pythonnet a required dependency only for Windows
0.3.0 (2017-05-09)¤
NOTE: This release breaks backward compatibility
- can now pass
**kwargs
from theClient64
constructor to theServer32
-subclass constructor - new command line arguments for starting the 32-bit server:
--kwargs
,--append_environ_path
- renamed the
--append_path
command line argument to--append_sys_path
Server32.interactive_console()
works on Windows and Linux- edit documentation (thanks to @karna48 for the pull request)
0.2.3 (2017-04-11)¤
- the frozen server32 executable (for Windows/Linux) now uses Python v3.6.1 and Python.NET v2.3.0
- include
ctypes.util.find_library
andsys.path
when searching for a library
0.2.2 (2017-03-03)¤
- refreeze server32 executables
0.2.1 (2017-03-02)¤
- fix
releaselevel
bug
0.2.0 (2017-03-02)¤
- examples now working in Linux
- fix MSL namespace
- include all C# modules, classes and System.Type objects in the .NET loaded-library object
- create a custom C# library for the examples
- edit docstrings and documentation
- many bug fixes
0.1.0 (2017-02-15)¤
- Initial release