Ошибка cx_freeze «zlib not avaiable» при использовании нескольких потоков
У меня есть приложение Python, которое отлично работает при запуске через стандартный интерпретатор, ноне когда заморожено с.cx_freeze
Мое приложение использует PythonThreading
модуль, и обычно имеет около 5 работающих компонентов, каждый из которых может быть индивидуально включен / отключен в своей конфигурации, и каждый работает в своем собственном отдельном потоке.
С 1 или 2 включенными компонентами проблем нет. Однако, когда включены 3 или более компонентов, я вижу следующее сообщение об ошибке для всех или почти всех моих потоков:
Exception in thread Thread-1:
Traceback (most recent call last):
File "C:\Python\64-bit\3.3\lib\threading.py", line 637, in _bootstrap_inner
File "", line 21, in run
from module import screenshot
File "C:\Python\64-bit\3.3\lib\importlib\_bootstrap.py", line 1616, in _handle_fromlist
File "C:\Python\64-bit\3.3\lib\importlib\_bootstrap.py", line 313, in _call_with_frames_removed
File "C:\Python\64-bit\3.3\lib\importlib\_bootstrap.py", line 1567, in _find_and_load
File "C:\Python\64-bit\3.3\lib\importlib\_bootstrap.py", line 1534, in _find_and_load_unlocked
File "", line 1, in
from PIL import ImageGrab
File "C:\Python\64-bit\3.3\lib\importlib\_bootstrap.py", line 1567, in _find_and_load
File "C:\Python\64-bit\3.3\lib\importlib\_bootstrap.py", line 1534, in _find_and_load_unlocked
zipimport.ZipImportError: can't decompress data; zlib not available
Несколько вещей, на которые стоит обратить внимание:
Python этоне установлен вC:\Python\64-bit\3.3
, так что я'Я не уверен, почему этот путь появляется в выводе выше. Он установлен по умолчанию вC:\Python33
, (Не уверен, является ли путь, показанный выше, фиктивным, или, возможно, путь человека, который составил одну из моих зависимостей.)Повторюсь - это начинает происходить постоянно, когда я запускаю более 2 потоков или около того. Этоникогда случается только с 1 активным потоком, и я никогда не видел, чтобы это случилось с 2 активными потоками.Эта проблематолько случается когдаcx_freeze
используется. Запуск его с интерпретатором Python не вызывает ошибок. Я'мы пробовали несколько разныхsetup.py
директивы (например,,,appendScriptToLibrary
appendScriptToExe
copyDependentFiles
create_shared_zip
), но вопрос всегда один и тот же.Мой код неt использовать функции zip - так что это должно быть что-то особенное для процесса замораживания.Мои мысли до сих пор:
Я думаю, что есть некоторая проблема с потоком, пытающимся получить доступ кzlib
или жеzipimport
модули, когда их использует другой поток (то есть блокирует их). (Интересно, что это не такХотя это может произойти в двух направлениях. Мой Google заставил меня немного изучить GIL - может ли это быть проблемой здесь? Или есть ли способ разрешить потокам захватывать только общую блокировку файла вместо эксклюзивной блокировки?Быть относительным новичком сcx_freeze
Ямы пробовали несколько разных методов, включаяzlib
модуль вsetup.py
, Тем не менее, я нене думаю, что это проблема сzlib
в частности, так как он работает нормально за пределами.cx_freeze
Среда:
Windows 7 64-битнаяPython 3.3 64-битныйcx_freeze 4.3.2Увидетьhttp://www.filedropper.com/threadtest для воспроизведения этого вопроса с минимальным кодом.