使用多个线程时cx_freeze"zlib not avaiable"错误

arn*_*d12 5 python zlib cx-freeze

我有一个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 "<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
Run Code Online (Sandbox Code Playgroud)

有几点需要注意:

  • Python 没有安装C:\Python\64-bit\3.3,所以我不确定为什么这条路径出现在上面的输出中.它安装在默认位置C:\Python33.(不确定上面显示的路径是否是虚拟路径,或者是编译我的某个依赖项的人的路径.)
  • 重申 - 当我启动超过2个线程时,这开始不断发生.它从来只用1个活动线程发生了,我从来没有见过这2个活动线程发生.
  • 此问题cx_freeze使用时发生.使用Python解释器运行它不会产生任何错误.我已经尝试了几种不同setup.py的指令(例如appendScriptToLibrary,appendScriptToExe,copyDependentFiles,create_shared_zip),但问题始终是相同的.
  • 我的代码没有使用zip函数 - 所以这必须是冻结过程特有的.

到目前为止我的想法:

  • 我认为当另一个线程正在使用它们时,一个线程试图访问zlibzipimport模块存在一些问题(即锁定它们).(有趣的是,这不会发生在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,以最少的代码复制此问题.