我有一个Python应用程序,它在通过标准解释器运行时非常有效,但在冻结时则不行cx_freeze
.
我的应用程序使用了python Threading
模块,通常有大约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
),但问题始终是相同的.
我的代码没有使用zip函数 - 所以这必须是冻结过程特有的.
到目前为止我的想法:
我认为当另一个线程正在使用它们时,一个线程试图访问zlib
或zipimport
模块存在一些问题(即锁定它们).(有趣的是,这不会发生在2个线程中.)我的Google-ing让我对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,以最少的代码复制此问题.