pickle.dump то записывает, то нет, в чем может быть причина?
Прога написана на Python 3.9. Проблема возникает на стороннем компе при использовании программы скомпилированной через pipinstall в exe файл. Программа то успешно записывает файл, то говорит что диск/папка/файл защищен от записи. При попытке перезаписать тот же самый файл ситуация аналогичная, то перезаписывает, то говорит что он защищен. Файл не занят другим или этим приложением, так как может отказывать в записи сразу после включении компа и в то же время успешно записывать при частом многократном выполнении функции. Код наипростейший:
with open(file_path, 'wb') as file:
pickle.dump(list_dump, file, protocol=5)
Может ли антивирус или другой защитник системы так глючить, то позволять записывать бинарник, то нет? И как с этим бороться?
Дополнение: программа протестирована более чем на 3000 компьютерах пользователей, подобная проблема встречается крайне редко. На тех компах, на которых не было её она и не появляется. А на тех на которых была зафиксирована - систематически то появляется то пропадает.
Наиболее интересный случай с компьютерным классом: проблема возникает одновременно на всех компах в классе и пропадает так же одновременно на всех.
Дополнение 2: текстовые файлы, типа *.cfg или *.ini записывает как положено, проблема только с бинарными дампами.
Ответы (2 шт):
В общем, консенсусное мнение - скорее всего проблема в антивирусе. Нужно просто немного подождать, пока антивирус проверит и отпустит ваш файл. Для этого можно сделать несколько попыток записи через некоторую паузу.
В данном примере делается 5 попыток с паузой в 3 секунды между попытками.
import pickle
import time
list_dump = list(range(5))
file_path = "file.pkl"
for count in range(1, 6):
if count > 1:
print(f'Попытка {count}')
time.sleep(3)
try:
with open(file_path, 'wb') as file:
pickle.dump(list_dump, file, protocol=5)
print('Файл записан')
break
except Exception as ex:
print(f'Ошибка: {ex}')
else:
print('Не удалось записать файл!!!')
Очевидно, что проблема внешняя по отношению к Вашему приложению. И я не стал бы ограничиваться влиянием антивирусов. Имеет смысл провести аудит софта в проблемных ситуациях. К такому эффекту могут привести многие сценарии с блокировкой IO. В любом случае, отправлять в продакшн такую как у Вас реализацию file IO, я имею в ввиду без обработки исключений, как минимум неосмотрительно. Подумайте в эту сторону. Грамотно написанный обработчик исключений позволит:
- Избежать аварийного прерывания
- В случае наличия хоть какой-то интерактивности, снять с Вас часть ответственности.