What’s new?#
The sections below will give you the most relevant news from the PyTango releases. For help moving to a new release, or for the complete list of changes, see the following links:
Unreleased#
Type: in development
Here we provide highlights of the changes currently on the development branch.
Changed#
tango.server.device_propertyvalues are now initialised from same-named class properties when no device database value is defined, matching the precedence of C++ device servers generated with POGO. Values are resolved in this order: the device database value, the class database value, the declared class property default, and the declared device property default. For example, given this device:class PowerSupply(Device): port = device_property(dtype=int, default_value=5555)
if the Tango database has a property set at device level, that value is used;
otherwise, if it is set at class level, the class database value is used;
otherwise, the device property default is used:
5555in this example.Note: with the high-level API we can’t declare
portasclass_propertyas well.
So, if you have a property set at class level in your Tango database that matches the name of a device property, and you don’t have the device property set in the Tango database, then the behaviour of that device will change:
it will now use the class-level database property instead of the code default,
a same-named class property default will take precedence over the device property default,
if the device property is mandatory, the device will now start, using the class-level value, instead of raising an exception.
Removed deprecation warnings when old telemetry environment variable names are set. They remain ignored for configuration. This allows different versions of PyTango to be run in the same environment.
Removed automatic refresh of client telemetry configuration, since this could not actually have an effect without restart. Client telemetry configuration is only captured from environment variables and fallback configuration files when Tango is imported.
Added#
The read, write and is_allowed handlers of a
tango.server.attributecan now be called from within device code through thetango.Attributeortango.WAttributeobject:self.my_attr.read(),self.my_attr.write(value)andself.my_attr.is_allowed(request_type). The same direct access is available on anytango.Attributeobject of that attribute, however it was obtained, for static as well as for dynamic high-level attributes. Classic API attributes, and dynamic attributes added as low-levelAttr/AttrDataobjects, raiseNotImplementedError. Thewritemethod is available only on writabletango.WAttributeobjects. The handlers run with the user’s own decorators applied (e.g.DebugIt). This is a shortcut allowing a direct call to your method, so Tango’s internal mechanisms that run when remote clients access your attributes: i.e.,always_executed_hook,read_attr_hardware, is_allowed handlers and telemetry are not triggered. Your handler is called exactly as you wrote it, so the call returns an awaitable only if your handler is a coroutine function. When the attribute has no is_allowed handler,is_allowedanswersTruein the green mode of your device. As for any othertango.Attributemethod, do not keep a reference to the attribute object across aremove_attributecall: the C++ object behind it is destroyed with the attribute.tango.Attribute.get_att_device(), which returns the device the attribute belongs to.
Fixed#
Fixed many deadlocks and stalled Python threads during event cleanup and queue access, callback and group operations, connections, database and attribute property calls, server polling and lifecycle operations, and runtime attribute configuration. These calls now release the GIL during blocking cppTango work, and reacquire the GIL before Python cleanup.
tango.Database.get_property_forced()no longer raises aTypeError. The binding required the trailingDbServerCacheargument of the C++ call, but that class is not bound, so the argument could not be supplied and has now been dropped.tango.Database.get_device_property_list()no longer raises aTypeErrorwhen called with atango.StdStringVectorcontainer, for the same reason, and now returns that container instead ofNone.tango.Database.build_connection()now calls the matching cppTango method instead of writing the file database.Elements of a
DevVarCharArrayare now range-checked: values outside the 0-255 range no longer wrap silently to255and0, so256raises anOverflowErrorand-1aTypeError. A non-integer element is now reported as “Expecting a integer type”, instead of “Expecting a char type”.Unsigned integer types now accept any object implementing
__index__, numpy integer scalars of any width included, instead of only python integers and numpy scalars of the exactly matching dtype. This applies toDevUChar,DevUShort,DevULongandDevULong64, both scalar and array.The
tango.Except.print_exception(), which is listed in the Except docstring but was forgotten to be added in bindings during move to pybind11, is now added back.tango.device_classcalls it when atango.DeviceClassconstructor raises, so the originalDevFailedwas replaced by anAttributeError.tango.DeviceProxy.write_attribute()no longer crashes or hangs when the attribute does not exist. The failure of the attribute configuration lookup was swallowed, so the value was converted against an uninitialised configuration: on macOS this segfaulted, on Linux it raised “unsupported data_format”. TheDevFailedis now propagated, matchingwrite_attributes(), and an attribute data type that the conversion cannot handle now raises aTypeErrornaming it instead of being silently ignored in release builds.
What’s new in PyTango 10.3.1?#
Date: 2026-07-20
Type: patch release
Changed#
Calling the
tango.Util.cleanup()method from the core server Tango loop is now optional (default=False). The call was added unconditionally in 10.3.0 to be able to restart the server loop in the same process. However, since this feature was only added to cppTango experimentally, it has introduced some bugs. For example, 10.3.0 devices servers would often segfault at the end of a normal shut down. For the (Multi)DeviceTestContext the default is set to True, so you can still create multiple test contexts in the same python process.
Added#
DeviceTestContextandMultiDeviceTestContextnow support setting class properties before the device server starts.
Fixed#
Memory leak when Python exceptions are converted to DevFailed exceptions. This was most noticeable if Python exceptions were raised in attribute handlers read very often. The bug was a regression introduced in 10.1.0.
PyTango now supports NumPy 2.5
Packaging#
Starting from this release:
PyTango no longer provides compiled wheels for the i686 platform, following NumPy’s example.
The Linux builder has moved from the manylinux2014 image to the manylinux_2_28 image (following NumPy 2.5). This means the Linux wheels can only be installed on Linux platforms with at least glibc 2.28 (including Debian 10+, Ubuntu 18.10+, Fedora 29+, CentOS/RHEL 8+).
The macOS image was updated to macos-15-xcode-16.
General:
PyTango packages are compiled with support for OpenTelemetry in Linux and macOS, but not Windows:
Compilation option |
Linux |
Windows |
MacOS |
|---|---|---|---|
TANGO_USE_TELEMETRY |
on |
off |
on |
Some of the dependencies packaged with the binary wheels on PyPI have changed. The bundled versions are:
Dependency |
Linux |
Windows |
MacOS |
|---|---|---|---|
cpptango |
10.3.3 |
10.3.3 |
10.3.3 |
omniorb / omniorb-libs |
4.3.4 |
4.3.3 |
4.3.4 |
libzmq / zeromq |
4.3.5 |
4.0.5-2 |
4.3.5 |
cppzmq |
4.11.0 |
4.7.1 |
4.11.0 |
libjpeg-turbo |
3.1.90 |
2.0.3 |
3.2.0 |
abseil |
20260107.0 |
- |
20260526.0 |
protobuf |
v33.6 |
- |
v35.1 |
c-ares |
v1.34.6 |
- |
1.34.8 |
re2 |
2025-11-05 |
- |
2025.11.05 |
OpenSSL |
3.6.2 |
- |
3.6.3 |
curl |
curl-8_20_0 |
- |
8.21.0 |
gRPC |
v1.80.0 |
- |
1.82.1 |
opentelemetry-cpp |
v1.27.0 |
- |
1.27.0 |
What’s new in PyTango 10.3.0?#
Date: 2026-06-03
Type: major release
Here we provide highlights of the changes currently on the development branch.
Changed#
PyTango requires at least cppTango 10.3.0. See the migration guide.
The telemetry environment variables now match cppTango 10.3.0, using the renamed
TANGO_TELEMETRY_TRACING_*andTANGO_TELEMETRY_LOGGING_*variables, and warning if the old names are used. The old names are no longer used for configuration. See the telemetry how-to guide.Device telemetry can now be reconfigured at runtime instead of being treated as an import-time-only setup on the Python side. PyTango recreates or replaces its Python tracer providers when cppTango runtime configuration changes. See the telemetry runtime configuration how-to. Note that for pure client scripts, the telemetry configuration will still be based on the environment variables at import time.
Telemetry topics can be used, but the only useful option at the moment is
all. Theusertopic can result is dis-jointed or incomplete traces. See telemetry topics.Missing OpenTelemetry Python dependencies now warn only when telemetry is actually requested, instead of warning merely at import time. See the telemetry how-to guide.
Added#
DeviceProxynow caches attribute configuration by default to speed up writes. Caching can be controlled via the newset_attribute_config_cache(),is_attribute_config_cache_enabled(), andinvalidate_attribute_config_cache()methods. The cache is automatically invalidated if aTypeErroris encountered during a write.Equality operators (
==/!=) are now exposed forCommandInfo,AttributeInfo,AttributeInfoEx,AttributeEventInfo, andAttributeAlarmInfo, matching the operators already present in cppTango.A
cleanupmethod has been added toUtil, andtango_loopnow calls it on shutdown. This makes it possible to restart a Tango server within the same process, which was not possible before.New
PyTangoThreadclass wrapsthreading.Threadinside anEnsureOmniThreadcontext, removing the need for scattered directEnsureOmniThreadcalls in user code.Device and DServer telemetry runtime configuration now works end-to-end in PyTango, including start/stop, enable/disable, tracing/logging endpoint changes, and topic changes. See the telemetry runtime configuration how-to, the
DeviceProxyAPI, and the high-levelDeviceAPI.The public telemetry API documentation now includes the tracer-provider factory hooks in other API objects, alongside the telemetry enums and endpoint types.
Fixed#
Fixed a regression (introduced in PyTango 10.1.0) where attribute event threshold properties (
rel_*/abs_*) were silently ignored when subscribing to change or archive events, causing subscriptions to succeed even when required thresholds were not configured.write_attribute_asynch()now reports the full error stack on failure. Previously, internal delegation towrite_attributes_asynchproduced incomplete error output.register_signal()can now be called without the optionalown_handlerargument. Previously omitting it raised aTypeError.Fixed a deadlock in asyncio device servers where cppTango device functions were called while still holding the GIL. This manifested as communication timeouts when asyncio servers were monitored by Jive ATK panels (see issue #629).
Fixed a memory leak on Python 3.14+ where
DeviceAttributevalues and many other objects were never freed due to a pybind11 bug in managed-dict handling. 19 classes are affected, includingDeviceProxy,Database, and allEventDatatypes.Fixed
subscribe_eventfailing when called from within an asyncio device server (self-subscription). Thread-pool threads could not locate the correct green executor, preventing event subscriptions from being registered (see issue #747).Fixed a crash when constructing
Databaseobjects caused by a pybind11 limitation with GIL-release call-guards on constructors.Fixed silent coercion of typos (e.g.
"ture","yse") toFalsewhen parsing string device property values as booleans. String-to-boolean conversion now strictly accepts onlyy/yes/t/true/on/1andn/no/f/false/off/0(case-insensitive), and raises an error otherwise. Errors during property parsing also now report the device name, property name, raw value, and target type to help diagnose configuration issues.Pulled in upstream changes from pytango-db 0.6.0, updating the bundled Python DatabaseDS implementation.
Removed#
Removed the
tango.server.Device.set_kernel_tracing_enabled()andtango.server.Device.is_kernel_tracing_enabled()methods. These methods should not have been available within a device. Instead, clients can enable kernel tracing by setting the telemetry topic"all".
Packaging#
PyTango packages are compiled with support for OpenTelemetry in Linux and macOS, but not Windows:
Compilation option |
Linux |
Windows |
MacOS |
|---|---|---|---|
TANGO_USE_TELEMETRY |
on |
off |
on |
Some of the dependencies packaged with the binary wheels on PyPI have changed. The bundled versions are:
Dependency |
Linux |
Windows |
MacOS |
|---|---|---|---|
cpptango |
10.3.2 |
10.3.2 |
10.3.2 |
omniorb / omniorb-libs |
4.3.4 |
4.3.3 |
4.3.4 |
libzmq / zeromq |
4.3.5 |
4.0.5-2 |
4.3.5 |
cppzmq |
4.11.0 |
4.7.1 |
4.11.0 |
libjpeg-turbo |
3.1.90 |
2.0.3 |
3.1.4.1 |
abseil |
20260107.1 |
- |
20260107.1 |
protobuf |
v33.6 |
- |
v33.5 |
c-ares |
v1.34.6 |
- |
1.34.6 |
re2 |
2025-11-05 |
- |
2025.11.05 |
OpenSSL |
3.6.2 |
- |
3.6.2 |
curl |
curl-8_20_0 |
- |
8.20.0 |
gRPC |
v1.80.0 |
- |
1.78.1 |
opentelemetry-cpp |
v1.27.0 |
- |
1.27.0 |
What’s new in PyTango 10.1.6?#
Date: 2026-09-04
Type: patch release
Fixed#
Fixed a deadlock in asyncio device servers where cppTango device functions were called while still holding the GIL (backport from 10.3.0).
Fixed a possible deadlock with
AttributeProxyandDatabaseduring object destruction (regression since 10.1.0, backport from planned 10.3.2).Fixed a crash when constructing
Databaseobjects caused by a pybind11 limitation with GIL-release call guards on constructors (backport from 10.3.0).Fixed
numpy.typingimport error with NumPy < 2 (regression since 10.1.5, backport from planned 10.3.2)Fixed several rare memory leaks and potential crashes in the C++ bindings (backport from planned 10.3.2).
Corrected ownership transfer for nested
Groupobjects, preventing memory leaks, and possible segmentation faults when groups are attached to a parent (backport from planned 10.3.2).
Packaging#
General:
PyTango packages are compiled with support for OpenTelemetry in Linux and macOS, but not Windows:
Compilation option |
Linux |
Windows |
MacOS |
|---|---|---|---|
TANGO_USE_TELEMETRY |
on |
off |
on |
Some of the dependencies packaged with the binary wheels on PyPI have changed. The bundled versions are:
Dependency |
Linux |
Windows |
MacOS |
|---|---|---|---|
cpptango |
10.1.2 |
10.1.2 |
10.1.2 |
omniorb / omniorb-libs |
4.3.4 |
4.3.0 |
4.3.4 |
libzmq / zeromq |
4.3.5 |
4.0.5-2 |
4.3.5 |
cppzmq |
4.11.0 |
4.7.1 |
4.11.0 |
libjpeg-turbo |
3.2.0 |
2.0.3 |
3.2.0 |
abseil |
20260526.0 |
- |
20260107.1 |
protobuf |
v35.1 |
- |
33.5 |
c-ares |
v1.34.8 |
- |
1.34.8 |
re2 |
2025-11-05 |
- |
2025.11.05 |
OpenSSL |
3.6.3 |
- |
3.6.4 |
curl |
curl-8_21_0 |
- |
8.22.0 |
gRPC |
v1.82.1 |
- |
1.78.1 |
opentelemetry-cpp |
v1.28.0 |
- |
1.21.0 |
What’s new in PyTango 10.1.5?#
Date: 2026-07-21
Type: patch release
Added#
DeviceTestContextandMultiDeviceTestContextnow support setting class properties before the device server starts (backport from 10.3.1)
Fixed#
Memory leak when Python exceptions are converted to DevFailed exceptions (backport from 10.3.1). This was most noticeable if Python exceptions were raised in attribute handlers read very often. The bug was a regression introduced in 10.1.0.
Support of NumPy 2.5 (backport from 10.3.1)
Packaging#
Similar to 10.3.1, in this release:
PyTango no longer provides compiled wheels for the i686 platform, following NumPy’s example.
The Linux builder has moved from the manylinux2014 image to the manylinux_2_28 image (following NumPy 2.5). This means the Linux wheels can only be installed on Linux platforms with at least glibc 2.28 (including Debian 10+, Ubuntu 18.10+, Fedora 29+, CentOS/RHEL 8+).
The macOS image was updated to macos-15-xcode-16.
General:
PyTango packages are compiled with support for OpenTelemetry in Linux and macOS, but not Windows:
Compilation option |
Linux |
Windows |
MacOS |
|---|---|---|---|
TANGO_USE_TELEMETRY |
on |
off |
on |
Some of the dependencies packaged with the binary wheels on PyPI have changed. The bundled versions are:
Dependency |
Linux |
Windows |
MacOS |
|---|---|---|---|
cpptango |
10.1.2 |
10.1.2 |
10.1.2 |
omniorb / omniorb-libs |
4.3.4 |
4.3.0 |
4.3.4 |
libzmq / zeromq |
4.3.5 |
4.0.5-2 |
4.3.5 |
cppzmq |
4.11.0 |
4.7.1 |
4.11.0 |
libjpeg-turbo |
3.2.0 |
2.0.3 |
3.2.0 |
abseil |
20260526.0 |
- |
20260107.1 |
protobuf |
v35.1 |
- |
v33.5 |
c-ares |
v1.34.8 |
- |
1.34.8 |
re2 |
2025-11-05 |
- |
2025.11.05 |
OpenSSL |
3.6.3 |
- |
3.6.3 |
curl |
curl-8_21_0 |
- |
8.21.0 |
gRPC |
v1.82.1 |
- |
1.78.1 |
opentelemetry-cpp |
v1.28.0 |
- |
1.21.0 |
What’s new in PyTango 10.1.4?#
Date: 2026-03-03
Type: patch release
Fixed#
Fixed pybind11 managed dict leak for all py::dynamic_attr() classes on Python 3.14+. This leak, in particular, was seen in DeviceProxy and AttributeProxy when reading attributes and receiving events with Python 3.14. But several other classes were also affected. See issue #744 and MR !980.
The packing details are the same as 10.1.3.
What’s new in PyTango 10.1.3?#
Date: 2026-02-10
Type: patch release
This release contains no changes in PyTango, only new packing details for the wheels:
Packaging#
PyTango packages are compiled with support for OpenTelemetry in Linux and macOS, but not Windows:
Compilation option |
Linux |
Windows |
MacOS |
|---|---|---|---|
TANGO_USE_TELEMETRY |
on |
off |
on |
Some of the dependencies packaged with the binary wheels on PyPI have changed. The bundled versions are:
Dependency |
Linux |
Windows |
MacOS |
|---|---|---|---|
cpptango |
10.1.2 |
10.1.2 |
10.1.2 |
omniorb / omniorb-libs |
4.3.4 |
4.3.0 |
4.3.4 |
libzmq / zeromq |
4.3.5 |
4.0.5-2 |
4.3.5 |
cppzmq |
4.11.0 |
4.7.1 |
4.11.0 |
libjpeg-turbo |
3.1.3 |
2.0.3 |
3.1.2 |
abseil |
20250814.1 |
- |
20250512.1 |
protobuf |
v33.5 |
- |
v31.1 |
c-ares |
v1.34.6 |
- |
1.34.6 |
re2 |
2025-11-05 |
- |
2025.11.05 |
OpenSSL |
3.6.1 |
- |
3.6.1 |
curl |
curl-8_18_0 |
- |
8.18.0 |
gRPC |
v1.76.0 |
- |
1.73.1 |
opentelemetry-cpp |
v1.24.0 |
- |
1.21.0 |
What’s new in PyTango 10.1.2?#
Date: 2026-01-09
Type: patch release
Fixed#
Regressions in 10.1.2:
when subscribing to change/archive events properties are ignored
DevVoid commands mutate type if decorator changes the type of the argument.
The packing details are the same as 10.1.1.
What’s new in PyTango 10.1.1?#
Date: 2025-10-31
Type: patch release
Fixed#
Regression in 10.1.0 of image (2-D) attributes under Windows, 64-bit.
The packing details are the same as 10.1.0.
What’s new in PyTango 10.1.0?#
Date: 2025-10-28
Type: major release
Here we provide highlights of the changes:
(You can find the full changelog in the history of changes with the links to related MRs, where the detailed descriptions of every change/new feature can be found.)
Changed#
PyTango requires at least cppTango 10.1.0. See the migration guide.
The biggest change in this release is moving the C++ Python bindings from Boost.Python to Pybind11. There are a few breaking changes. See the migration guide.
The parameter names for attribute write methods, such as
write_attribute,write_attributes,write_read_attribute,write_read_attributes,write_attribute_asyncwrite_attributes_asyncforDeviceProxy,AttributeProxyandGroupwere changed to be consistent. See migration guide.When subscribing to events, there are now more options, including asynchronous mode. This new mode can significantly speed up subscription to a large number of attributes. See the migration guide.
The string representation of nested structs has been improved so they print a little more nicely.
References to event subscription callback methods are immediately cleared on unsubscription (instead of sticking around for at least a minute).
Clients (
DeviceProxy,AttributeProxy,Group) and servers now release the Python GIL in most cases when waiting on cppTango, allowing better concurrency, and avoiding some deadlocks. Note: TheDatabaseclient wasn’t updated, and still holds the GIL for most calls.Better types hints for the extension code (in stub files), and the stub files are now included in the conda-forge osx-arm64 packages.
Many improvements to the documentation, including for
attribute.The
MultiDeviceTestContextandDeviceTestContextnow check if the device server could be properly shutdown (when exiting the context handler, or callingstop). If the device server could not be stopped, aRuntimeErroris raised. This will help identify problematic device servers during testing. If using a subprocess (process=True), the subprocess will be killed.Support Coverage.py runs using
sys.monitoring(aka the “sysmon” core).Removed limitation of NumPy version < 2.3 at build time.
Signatures of
put_property,get_propertyanddelete_propertymethods ofDeviceProxyandAttributeProxyobjects were unified.get_propertymethod now accepts dicts and in case of empty list/tuple/dict input returns an empty dict (before it could returnNonein some cases)For the Python-based DatabaseDS server (developer tool):
Some of the “default” values in the database have been improved to fix a problem with getting device info for the DB device. However, it will only take effect when creating a new database from scratch. If you don’t want to do that you can also fix them by running a command like this:
sqlite3 tango_database.db "UPDATE device SET pid='0' WHERE pid = 'nada';"
SQLite databases created using earlier versions of PyTango might have issues with some commands not working. E.g., at startup you could get “device dserver/databaseds/2 not defined in the database !”. If that happens, create new database file from scratch. If you need to keep your data, you could use a tool like dsconfig to dump the old database to JSON and load it into the new database.
Added#
Python 3.14 support.
When defining attributes, you can indicate that they push events in place, removing the need for extra calls to
set_change_event, etc. See the migration guide.Command handler docstrings can now populate the
in_type_descandout_type_descfields automatically. There is support for ReST, Google, Numpydoc-style and Epydoc docstrings. See the migration guide.The client identity is now available in devices when handling command or attribute read/write calls. However, only for synchronous green mode device servers. See
tango.server.Device.get_client_ident(). If OpenTelemetry is enabled, the client details will be included in relevant spans (for all green modes).Non-synchronous green mode clients now keep OpenTelemetry context for all traced calls.
Two test utility functions:
tango.test_utils.wait_for_proxy()andtango.test_utils.wait_for_nodb_proxy_via_pid().Added fast overload for attribute write methods, such as
write_attribute,write_attributes,write_read_attribute,write_read_attributes,write_attribute_asyncwrite_attributes_async,write,write_read,write_asynchforDeviceProxy,AttributeProxyandGroupwith which the additional IO to server can be avoided. See migration guide.Default values for
device_propertyandclass_propertycan be also provided as the string representation (array of string representations) of the value(s)
Fixed#
Dynamic commands with no argument (regression in 10.0.0).
pre_init_callbackandpost_init_callbackused with a sequence (regression in 10.0.0).Type hints with decorated commands - order no longer matters.
Type hints are parsed when
from __future__ import annotationsis used.Crash when exception raised in
delete_device.AttributeProxy’s slow initialization (remove unnecessary listing of all commands and attributes).
Removed#
Support for Python 3.9.
Support for Tango pipes.
The
dim_xanddim_yparameters for setting attribute values and pushing events. See the migration guide. The size is automatically determined from the data.
Packaging#
PyTango packages are compiled with support for OpenTelemetry in Linux and macOS, but not Windows:
Compilation option |
Linux |
Windows |
MacOS |
|---|---|---|---|
TANGO_USE_TELEMETRY |
on |
off |
on |
Some of the dependencies packaged with the binary wheels on PyPI have changed. The bundled versions are:
Dependency |
Linux |
Windows |
MacOS |
|---|---|---|---|
cpptango |
10.1.1 |
10.1.1 |
10.1.1 |
omniorb / omniorb-libs |
4.3.3 |
4.3.0 |
4.3.3 |
libzmq / zeromq |
4.3.5 |
4.0.5-2 |
4.3.5 |
cppzmq |
4.11.0 |
4.7.1 |
4.10.0 |
libjpeg-turbo |
3.1.2 |
2.0.3 |
3.1.0 |
abseil |
20250814.1 |
- |
20250512.1 |
protobuf |
v32.1 |
- |
v31.1 |
c-ares |
v1.34.5 |
- |
1.34.5 |
re2 |
2025-08-12 |
- |
2025.08.12 |
OpenSSL |
3.6.0 |
- |
3.5.4 |
curl |
curl-8_16_0 |
- |
8.16.0 |
gRPC |
v1.75.1 |
- |
1.73.1 |
opentelemetry-cpp |
v1.23.0 |
- |
1.21.0 |
What’s new in PyTango 10.0.4?#
Date: 2026-02-10
Type: patch release
This release contains no changes in PyTango, only new packing details for the wheels:
Packaging#
PyTango packages are compiled with support for OpenTelemetry in Linux and macOS, but not Windows:
Compilation option |
Linux |
Windows |
MacOS |
|---|---|---|---|
TANGO_USE_TELEMETRY |
on |
off |
on |
Some of the dependencies packaged with the binary wheels on PyPI have changed. The bundled versions are:
Dependency |
Linux |
Windows |
MacOS |
|---|---|---|---|
cpptango |
10.0.4 |
10.0.4 |
10.0.4 |
omniorb / omniorb-libs |
4.3.4 |
4.3.0 |
4.3.4 |
libzmq / zeromq |
4.3.5 |
4.0.5-2 |
4.3.5 |
cppzmq |
4.11.0 |
4.7.1 |
4.11.0 |
libjpeg-turbo |
3.1.3 |
2.0.3 |
3.1.2 |
boost |
1.87.0 |
1.86.0 |
1.87.0 |
abseil |
20250814.1 |
- |
20250512.1 |
protobuf |
v33.5 |
- |
v31.1 |
c-ares |
v1.34.6 |
- |
1.34.6 |
re2 |
2025-11-05 |
- |
2025.11.05 |
OpenSSL |
3.6.1 |
- |
3.6.1 |
curl |
curl-8_18_0 |
- |
8.18.0 |
gRPC |
v1.76.0 |
- |
1.73.1 |
opentelemetry-cpp |
v1.24.0 |
- |
1.21.0 |
What’s new in PyTango 10.0.3?#
Date: 2025-07-25
Type: patch release
Here we provide short highlights of the changes. You can find the full changelog in revisions history.
Changed#
Silenced pydev debugger warnings about frozen modules at import time.
NumPy version pinned < 2.3 at build time. Newer versions can be used at runtime.
Updated logo for documentation.
OpenTelemetry SDK log level can be set via an environment variable.
Fixed#
Fixed regression in
tango.DeviceProxy.read_attributes_reply()(noticed in Taurus).Fixed segfault when client application using OpenTelemetry with OpenSSL exits quickly (under a few seconds).
Various issues in the Python DatabaseDS implementation.
Packaging#
PyTango packages are compiled with support for OpenTelemetry in Linux and macOS, but not Windows:
Compilation option |
Linux |
Windows |
MacOS |
|---|---|---|---|
TANGO_USE_TELEMETRY |
on |
off |
on |
Some of the dependencies packaged with the binary wheels on PyPI have changed. The bundled versions are:
Dependency |
Linux |
Windows |
MacOS |
|---|---|---|---|
cpptango |
10.0.2 |
10.0.2 |
10.0.2 |
omniorb / omniorb-libs |
4.3.3 |
4.3.0 |
4.3.3 |
libzmq / zeromq |
4.3.5 |
4.0.5-2 |
4.3.5 |
cppzmq |
4.11.0 |
4.7.1 |
4.10.0 |
libjpeg-turbo |
3.1.1 |
2.0.3 |
3.1.0 |
boost |
1.87.0 |
1.86.0 |
1.87.0 |
abseil |
20250512.1 |
- |
20250512.1 |
protobuf |
v31.1 |
- |
v31.1 |
c-ares |
v1.34.5 |
- |
1.34.5 |
re2 |
2025-07-22 |
- |
2025.07.22 |
OpenSSL |
3.5.1 |
- |
3.5.1 |
curl |
curl-8_15_0 |
- |
8.14.1 |
gRPC |
v1.73.1 |
- |
1.73.1 |
opentelemetry-cpp |
v1.22.0 |
- |
1.21.0 |
What’s new in PyTango 10.0.2?#
Date: 2025-03-07
Type: minor release
Note: There was no 10.0.1 release (the number was skipped).
You can find the full changelog in revisions history with the links to related MRs, where the detailed descriptions of every change/new feature can be found.
Here we provide short highlights of the changes:
Changed#
Documentation updated with a new theme, and changed from reStructuredText syntax to MyST markdown.
Deprecated pipes for clients and servers. Removal scheduled for v10.1.0.
Deprecated the old experimental Tango object API which was broken. Removal scheduled for v11.0.0.
Added#
Python 3.13 binary wheels on PyPI.
tango.Group.command_inout()and related methods now accept simple data types, like float and int, instead of the inconvenientDeviceData.
Fixed#
Occasional deadlock when a
Groupobject that used events is destroyed.tango.AttributeProxy.write_asynch()was broken.Logging decorators like
DebugItwork withshow_kwargs=True.Occasional segfault when an
AttrConfEventDataobject are destroyed.Segfault when pytest failure report tries to print device name.
Various issues in the Python DatabaseDS implementation
Packaging#
PyTango packages are compiled with support for OpenTelemetry in Linux and macOS, but not Windows:
Compilation option |
Linux |
Windows |
MacOS |
|---|---|---|---|
TANGO_USE_TELEMETRY |
on |
off |
on |
Some of the dependencies packaged with the binary wheels on PyPI have changed. The bundled versions are:
Dependency |
Linux |
Windows |
MacOS |
|---|---|---|---|
cpptango |
10.0.2 |
10.0.2 |
10.0.2 |
omniorb / omniorb-libs |
4.3.2 |
4.3.0 |
4.3.2 |
libzmq / zeromq |
4.3.5 |
4.0.5-2 |
4.3.5 |
cppzmq |
4.10.0 |
4.7.1 |
4.10.0 |
libjpeg-turbo |
3.0.0 |
2.0.3 |
3.0.0 |
boost |
1.87.0 |
1.86.0 |
1.87.0 |
abseil |
20250127.0 |
- |
20240722.0 |
protobuf |
v29.3 |
- |
v28.3 |
c-ares |
v1.34.4 |
- |
1.34.4 |
re2 |
2024-07-02 |
- |
2024.07.02 |
OpenSSL |
3.4.0 |
- |
3.4.1 |
curl |
curl-8_12_0 |
- |
8.12.1 |
gRPC |
v1.70.1 |
- |
1.67.1 |
opentelemetry-cpp |
v1.19.0 |
- |
1.18.0 |
What’s new in PyTango 10.0.0?#
Date: 2024-10-01
Type: major release
An overview of the major new features are available in the Tango v10 and IDLv6 presentation materials from the Tango Collaboration meeting.
You can find the full changelog in revisions history with the links to related MRs, where the detailed descriptions of every change/new feature can be found.
Here we provide short highlights of the changes:
Changed#
PyTango requires at least cppTango 10.0.0. See the migration guide.
High-level
Deviceand low-levelLatestDeviceImplclasses now use Device_6Impl, with Tango IDLv6 interfaceWhen using the Asyncio green mode, a
DeprecationWarningwill be emitted during theinit_device()call, if any or the methods inDeviceare not coroutine functions (i.e., defined withasync def). Note, support of synchronous methods in Asyncio servers will be removed in a future release. See the migration guide.The Python GIL is released when adding/removing dynamic attributes calls into cppTango.
Error messages occurring during device start-up are now redirected to stderr instead of stdout
PyTango must be complied with the C++17 standard
Added#
Numpy 2.0 support
PyTango now supports OpenTelemetry for distributed tracing - see the telemetry how-to guide
Support for alarm events
Extended device information (DevInfo6 implementation, from IDLv6) - see the version info tutorial
For Asyncio green mode servers, added two coroutine functions to be used when adding and removing dynamic attributes. See the migration guide.
Pydevd debugging (as well as coverage) now is extended to dynamic attributes and commands. If necessary, the feature can be disabled by setting the environment variable
PYTANGO_DISABLE_DEBUG_TRACE_PATCHING=1.PyTango provides a stub file with typing information for improved autocompletion in your code editor (except conda packages for osx-arm64 and linux-aarch64)
Events can be pushed with Python exception objects directly, no need to convert to
DevFailedDevice description, status, state can be set at the device start-up. See class attributes
DEVICE_CLASS_DESCRIPTION,DEVICE_CLASS_INITIAL_STATUS, andDEVICE_CLASS_INITIAL_STATE.
Fixed#
Segfault when Restart Command is used on a PyTango server (first reported 6 years ago!)
Deadlock when pushing event from attribute read method (regression, introduced in 9.5.1)
Memory leak when writing
DevStringattribute withDeviceProxyis fixedSegfault in
push_archive_event(attr_name)with attr_name != state or status was fixedVarious fixes of asyncio
tango.asyncio.DeviceProxymethods. High-level reads, and getattr calls can (and must) be awaited.Fixes of *_asynch methods on
DeviceProxy. I.e., when using Tango’s asynchronous push/pull callback model for accessing attributes and commands. This is not related to Python asyncio methods and coroutine functions.class_propertyis now inherited by child device classesVarious issues in the Python DatabaseDS implementation
Removed#
Reverted the fix from 9.5.1 for resolving a crash in Asyncio devices when an attribute is read at the same time as an event is being pushed (original bug is not fixed). It was reverted because it caused a deadlock in existing code that was pushing events from attribute read methods.
Following cppTango, event type
QUALITY_EVENTwas removed from theEventTypeenum, as well as thequality_event_subscribedmethod from theAttributeclass. See the migration guide.
Packaging#
PyTango packages are compiled with support for OpenTelemetry in Linux and macOS, but not Windows:
Compilation option |
Linux |
Windows |
MacOS |
|---|---|---|---|
TANGO_USE_TELEMETRY |
on |
off |
on |
Some of the dependencies packaged with the binary wheels on PyPI have changed. The bundled versions are:
Dependency |
Linux |
Windows |
MacOS |
|---|---|---|---|
cpptango |
10.0.0 |
10.0.0 |
10.0.0 |
omniorb / omniorb-libs |
4.3.2 |
4.3.0 |
4.3.2 |
libzmq / zeromq |
4.3.5 |
4.0.5-2 |
4.3.5 |
cppzmq |
4.10.0 |
4.7.1 |
4.10.0 |
libjpeg-turbo |
3.0.0 |
2.0.3 |
3.0.0 |
boost |
1.85.0 |
1.85.0 |
1.85.0 |
abseil |
20240722.0 |
- |
20240722.0 |
protobuf |
v28.2 |
- |
v27.5 |
c-ares |
v1.33.1 |
- |
1.33.1 |
re2 |
2024-07-02 |
- |
2023.09.01 |
OpenSSL |
3.3.2 |
- |
3.3.2 |
curl |
curl-8_10_1 |
- |
8.10.1 |
gRPC |
v1.66.2 |
- |
1.65.5 |
opentelemetry-cpp |
v1.16.1 |
- |
1.16.1 |
What’s new in PyTango 9.5.1?#
Date: 2024-03-28 9.5.1
Type: minor release
Changed#
Restricted NumPy to 1.x, since we do not have NumPy 2.0 support yet.
Improved some error message related to invalid types passed to
DeviceProxy.Extended pydevd debugging and coverage to dynamic attributes and commands.
Fixed#
High-level attribute reads using asyncio DeviceProxies can now be awaited.
Asyncio green mode devices no longer crash when an attribute is read at the same time as an event is being pushed.
Numpy 1.20.0 no longer causes an import error.
High-level Device class inheritance now supports
class_property.
What’s new in PyTango 9.5.0?#
Date: 2023-11-23
Type: major release
Changed#
PyTango requires at least cppTango 9.5.0. See the migration guide.
When using the asyncio green mode, a
PyTangoUserWarningwill be emitted during theinit_device()call, if the user’sDevicemethods are not coroutines (i.e., defined withasync def).Use
127.0.0.1as the default host for (Multi)DeviceTestContext instead of trying to find an external IP. This allows tests to work on systems that only have a loopback interface, and also reduces firewall warnings when running tests (at least on macOS). If using it from the command line like,python -m tango.test_context MyDS.MyDevice, an external IP is still the default.All warnings generated by PyTango are now instances of
PyTangoUserWarning, which inherits from Python’sUserWarning.Some of the dependencies packaged with the binary wheels on PyPI have changed. The bundled versions are:
Dependency |
Linux |
Windows |
MacOS |
|---|---|---|---|
cpptango |
9.5.0 |
9.5.0 |
9.5.0 |
omniorb / omniorb-libs |
4.3.1 |
4.3.0 |
4.3.1 |
libzmq / zeromq |
4.3.5 |
4.0.5-2 |
4.3.5 |
cppzmq |
4.10.0 |
4.7.1 |
4.10.0 |
libjpeg-turbo |
3.0.0 |
2.0.3 |
3.0.0 |
tango-idl |
5.1.1 |
5.1.2 |
5.1.2 |
boost |
1.82.0 |
1.83.0 |
1.82.0 |
Added#
Short-name access can be used for (Multi)DeviceTestContext devices. See migration guide
Experimental feature: use Python type hints to declare Device more easily. Read more in the new section: Use Python type hints when declaring a device.
set_write_value()now supports IMAGE attributes.Forwarded attributes are partially supported in the (Multi)DeviceTestContext. We say partially, because a cppTango limitation (at least version 9.5.0) means root attributes on devices running in “nodb” mode (like those in launched by the TestContext) don’t work. However, it does work if the test device accesses a root attribute on a Tango device running with a Tango database.
Support for
EncodedAttributein high-level API devices.Added
free_itandclean_dbarguments totango.server.Device.remove_attribute()andtango.LatestDeviceImpl.remove_attribute()methods.Support Tango server debugging with PyCharm, PyDev and VS Code. Breakpoints now work for command and attribute handler methods, as well as other standard
Devicemethods, when running through a debugger that is based on pydevd. However, it doesn’t currently work with dynamic attributes and commands. If necessary, the feature can be disabled by setting the environment variablePYTANGO_DISABLE_DEBUG_TRACE_PATCHING=1.Added support for Python 3.12.
Fixed#
Fixed various issues with
DeviceProxywith non-synchronous green mode devices launched withDeviceTestContextandMultiDeviceTestContext. This also fixes support for tests decorated with@pytest.mark.asyncio.
Removed#
Breaking change to the API: the
DevIntdata type was removed, due to its removal from cppTango. See the migration guide.Deprecated signature,
get_write_value(self, lst)(), was removed.
What’s new in PyTango 9.4.2?#
Date: 2023-07-27
Type: minor release
Changed#
New python and NumPy version policy is implemented.
Added#
Correct code coverage of server’s methods can be obtained
server_init_hook was added to high-level and low-level API
macOS wheels now are provided
Fixed#
DevEncoded attributes and commands read methods are now segfault safe
DevEncoded attributes and commands now decoded with utf-8
DevEncoded attributes and commands can be extracted and written as str, bytes and bytesarray
If string encoding with Latin-1 fails, UnicodeError will be raised instead of segfaulting
When user gives empty spectrum properties to the DeviceTestContext, they will be patched with one space symbol “ “ for each element
In case patching failed or any other problems with FileDatabase, instead of crash PyTango will raise an exception and print out generated file
Regression when applying additional decorators on attribute accessor functions. Method calls would have the wrong signature and fail.
Removed#
Support for Python < 3.9. See version policy
What’s new in PyTango 9.4.1?#
Date: 2023-03-15
Type: major release (breaking changes compared to 9.4.0)
Changed#
Removed additional function signatures for high-level attribute read/write/is_allowed methods that were added in 9.4.0 resulting in a regression. For example, the high-level write method API for dynamic attributes of the form
write_method(self, attr, value)has been removed, leaving onlywrite_method(self, attr). Similarly, unbound functions that could be used without a reference to the device object, likeread_function(), are no longer supported - onlyread_function(device). See the migration guide.- The dependencies packaged with the binary PyPI wheels are as follows:
- Linux:
cpptango: 9.4.1
omniorb: 4.2.5 (changed since PyTango 9.4.0)
libzmq: v4.3.4
cppzmq: v4.7.1
libjpeg-turbo: 2.0.9
tango-idl: 5.1.1
boost: 1.80.0 (with patch for Python 3.11 support)
- Windows:
cpptango: 9.4.1
omniorb: 4.2.5
libzmq: v4.0.5-2
cppzmq: v4.7.1
libjpeg-turbo: 2.0.3
tango-idl: 5.1.2
boost: 1.73.0
Fixed#
Regression for undecorated read attribute accessor functions in derived device classes. E.g., if we have
class A(Device)with attribute reading via methodA.read_my_attribute, then readingmy_attributefromclass B(A)would fail. More generally, repeated wrapping of methods related to attributes, commands and standard methods (likeinit_device) is now avoided.Regression when applying additional decorators on attribute accessor functions. Method calls would have the wrong signature and fail.
What’s new in PyTango 9.4.0?#
Date: 2023-02-15
Type: major release
Warning
significant regressions - use newer release!
Changed#
PyTango requires at least cppTango 9.4.1. See the migration guide.
Breaking change to the API when using empty spectrum and image attributes. Clients reading an empty attribute will get an empty sequence (list/tuple/numpy array) instead of a
Nonevalue. Similarly, devices that have an empty sequence written will receive that in the write method instead of aNonevalue. See the migration guide on empty attributes and extract as.Python dependencies: numpy is no longer optional - it is required. Other new requirements are packaging and psutil.
Binary wheels for more platforms, including Linux, are available on PyPI. Fast installation without compiling and figuring out all the dependencies!
- The dependencies packaged with the binary PyPI wheels are as follows:
- Linux:
cpptango: 9.4.1
omniorb: 4.2.4
libzmq: v4.3.4
cppzmq: v4.7.1
libjpeg-turbo: 2.0.9
tango-idl: 5.1.1
boost: 1.80.0 (with patch for Python 3.11 support)
- Windows:
cpptango: 9.4.1
omniorb: 4.2.5
libzmq: v4.0.5-2
cppzmq: v4.7.1
libjpeg-turbo: 2.0.3
tango-idl: 5.1.2
boost: 1.73.0
When using the
--portcommandline option without--host, theORBendpointforgio::tcppassed to cppTango will use"0.0.0.0"as the host instead of an empty string. This is to workaround a regression with cppTango 9.4.1. Note that if the--ORBendPointcommandline option is specified directly, it will not be modified. This will lead to a crash if an empty host is used, e.g.,--ORBendPoint giop:tcp::1234.
Added#
User methods for attribute access (read/write/is allowed), and for commands (execute/is allowed) can be plain functions. They don’t need to be methods on the device class anymore. There was some inconsistency with this previously, but now it is the same for static and dynamic attributes, and for commands. Static and dynamic commands can also take an
fisallowedkeyword argument. See the migration guide.Device methods for reading and writing dynamic attributes can use the high-level API instead of getting and setting values inside
Attrobjects. See the migration guide.High-level API support for accessing and creating DevEnum spectrum and image attributes. See the migration guide.
Developers can optionally allow Python attributes to be added to a
DeviceProxyinstance by callingunfreeze_dynamic_interface(). The default behaviour is still to raise an exception when accessing unknown attributes. See the migration guide.Attribute decorators have additional methods:
getter(),read()andis_allowed(). See the migration guide.Python 3.11 support.
MacOS support. This is easiest installing from Conda-forge. Compiling locally is not recommended. See the installation guide.
Integrated development environment (IDE) autocompletion for methods inherited from
tango.server.Deviceandtango.LatestDeviceImpl. Attributes from the full class hierarchy are now more easily accessible directly in your editor.
Fixed#
Log stream calls that include literal
%symbols but no args now work properly without raising an exception. E.g.,self.debug_stream("I want to log a %s symbol"). See the migration guide.Writing a
numpy.arrayto a spectrum attribute of typestrno longer crashes.Reading an enum attribute with
ATTR_INVALIDquality via the high-level API now returnsNoneinstead of crashing. This behaviour is consistent with the other data types.
Removed#
Support for Python 2.7 and Python 3.5.
The option to install PyTango without numpy.