cx_freeze „zlib not avaiable” podczas używania wielu wątków
Mam aplikację Pythona, która działa idealnie, gdy jest uruchamiana przez standardowy interpreter, alenie po zamrożeniucx_freeze
.
Moja aplikacja korzysta z PythonaThreading
moduł i zazwyczaj ma około 5 uruchomionych komponentów, z których każdy może być indywidualnie włączany / wyłączany w swojej konfiguracji, a każdy z nich działa we własnym indywidualnym wątku.
Przy włączonym 1 lub 2 komponentach bez problemu. Jednak gdy włączone są 3 lub więcej składników, wyświetlany jest następujący komunikat o błędzie dla wszystkich lub prawie wszystkich moich wątków:
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 "<absolute path to my .py file on disk>", 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 "<absolute path to my .py file on disk>", line 1, in <module>
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
Kilka rzeczy do odnotowania:
Python tonie zainstalowany wC:\Python\64-bit\3.3
, więc nie jestem pewien, dlaczego ta ścieżka pojawia się na wyjściu powyżej. Jest zainstalowany w domyślnej lokalizacjiC:\Python33
. (Nie jestem pewien, czy ścieżka pokazana powyżej jest atrapą, czy może ścieżką osoby, która skompilowała jedną z moich zależności).Powtarzam - zaczyna się to stale, gdy uruchamiam więcej niż 2 wątki. Tonigdy dzieje się tylko z 1 aktywnym wątkiem i nigdy nie widziałem, aby stało się to z dwoma aktywnymi wątkami.Ten przypadektylko dzieje się, gdycx_freeze
jest używany. Uruchomienie go za pomocą interpretera Pythona nie powoduje błędów. Próbowałem kilku różnychsetup.py
dyrektywy (np.appendScriptToLibrary
, appendScriptToExe
, copyDependentFiles
, create_shared_zip
), ale problem jest zawsze taki sam.Mój kod nie korzysta z funkcji zip - więc musi to być coś specyficznego dla procesu zamrażania.Moje myśli do tej pory:
Myślę, że jest jakiś problem z wątkiem próbującym uzyskać dostęp dozlib
lubzipimport
moduły, gdy używa ich inny wątek (tzn. ma na nich blokadę). (Ciekawe, że nie dzieje się tak jednak w przypadku dwóch wątków.) Moja praca z Google sprawiła, że przeprowadziłem kilka badań nad GIL - czy to może być problem? Czy istnieje jakiś sposób, aby wątki mogły pobrać blokadę współdzieloną z pliku zamiast blokady wyłącznej?Będąc względnym nowicjuszem zcx_freeze
, Wypróbowałem kilka różnych metod włączaniazlib
moduł wsetup.py
. Nie sądzę jednak, aby był to problemzlib
specjalnie, ponieważ działa dobrze pozacx_freeze
.Środowisko:
Windows 7 64-bitPython 3.3 64-bitcx_freeze 4.3.2Widziećhttp://www.filedropper.com/threadtest w celu odtworzenia tego problemu z minimalnym kodem.