Странное исключение в деструкторе, который использует метод datetime strftime - PullRequest
0 голосов
/ 10 декабря 2018

мой метод __del_ вызвал другой метод, который закрывает соединение с оборудованием.

В методе, который закрывает соединение, я использую следующую строку (фактически вызывается из метода get_timedate_plus_file_string, как видно в Traceback):

x =  ("ID{:02} {} -".format(print_id_num,datetime.now().strftime("%d/%m/%Y %H:%M:%S")))

И я получаю следующую ошибку:

Exception ignored in: <bound method temp_class.__del__ of
<drv_temp_class.c_temp_class object at 0x0000000007DF8A58>>
Traceback (most recent call last):
  File "D:\1\drv_temp_class.py", line 323, in __del__
  File "D:\1\drv_temp_class.py", line 309, in close_connection
  File "D:\1\global_def.py", line 162, in print_msg
  File "D:\1\global_def.py", line 105, in get_timedate_plus_file_string
  File "<frozen importlib._bootstrap>", line 969, in _find_and_load
  File "<frozen importlib._bootstrap>", line 954, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 887, in _find_spec
TypeError: 'NoneType' object is not iterable

Я отлаживаю проблему с помощью метода strftime, что означает, что при удалении форматирования strftime все работает.

Кроме того, я заменил использование datetime.datetime в time.localtime, и все работает.

Есть идеи?

1 Ответ

0 голосов
/ 10 декабря 2018

Метод __del__ может быть вызван во время выключения интерпретатора, возможно, после того, как модули (например, datetime) уже были очищены (что, по-видимому, происходит в вашем случае).Как правило, лучше использовать менеджер контекста для ресурсов, которые необходимо очистить, чтобы код очистки происходил до того, как интерпретатор начнет разрушать все.

...