The unattended-upgrades mechanism updated python3 earlier today on our servers, leading to incompatibilities between running python stdlib code and updated stdlib code. This is not a bug in Frappe.
opened 12:02PM - 17 Sep 24 UTC
type-bug
# Bug report
### Bug description:
Pull request #122233 introduced a new class … `HeaderWriteError` in commit 097633981879b3c9de9a1dd120d3aa585ecc2384 and imports that from `email.generator`.
This breaks running applications that have imported other parts of `email` before the update, and then try to import the generator past the update.
Now this is a bit silly, but it is what `email.message.Message.as_string()` does, it imports `email.generator` *inside* the function - which may happen at any point of the program run-time rather than at startup.
For example, the following pseudo-code will fail, assuming it has not generated another email earlier or manually imported the `email.generator` module.
```python
import email.message
<do something for a long time, such as wait for a web form, Python is being upgraded here>
msg = <prepare a message>
msg.as_string()
```
A particular instance of the issue is the `unattended-upgrades` package in Ubuntu and Debian, which will install the security update and then may send an email and fail there due to the ImportError, see https://bugs.launchpad.net/ubuntu/+source/python3.8/+bug/2080940.
I'm wondering if it's feasible to add a workaround to the stable branches:
Cchange the email.generator module import:
```python
from email.errors import HeaderWriteError
```
to graciously support the previous version email.errors:
```python
try:
from email.errors import HeaderWriteError
except ImportError:
from email.errors import MessageError as HeaderWriteError
```
This is a safe change, existing applications, where the import fails can't be having `except HeaderWriteError` statements anyway.
Thanks.
### CPython versions tested on:
3.12
### Operating systems tested on:
_No response_
5 Likes