Xlwings 模块导致 PyInstaller EXE 抛出异常

Xlwings module causes PyInstaller EXE to throw exception

我正在尝试使用 pyinstaller 冻结名为 test.py 的简单 Python 3.4 脚本。该脚本导入 0.7.0 版的 xlwings 模块(我通过 pip 安装),然后打印一条消息。

import xlwings
print("Fine!")

如果我删除 xlwings 导入,那么 pyinstaller test.py 会在 dist 中生成一个 EXE(我在 Windows 10)打印 "Fine" 消息然后退出的文件夹。但是,如果我导入 xlwings 模块,该命令会生成一个打印此消息然后退出的 EXE(不打印 "Fine" 消息):

Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "<frozen importlib._bootstrap>", line 2237, in _find_and_load
  File "<frozen importlib._bootstrap>", line 2226, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 1191, in _load_unlocked
  File "<frozen importlib._bootstrap>", line 1161, in _load_backward_compatible
  File "C:\Python34\lib\site-packages\PyInstaller\loader\pyimod03_importers.py", line 389, in load_module
    exec(bytecode, module.__dict__)
  File "site-packages\xlwings\__init__.py", line 20, in <module>
  File "<frozen importlib._bootstrap>", line 2237, in _find_and_load
  File "<frozen importlib._bootstrap>", line 2226, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 1191, in _load_unlocked
  File "<frozen importlib._bootstrap>", line 1161, in _load_backward_compatible
  File "C:\Python34\lib\site-packages\PyInstaller\loader\pyimod03_importers.py", line 389, in load_module
    exec(bytecode, module.__dict__)
  File "site-packages\xlwings\_xlwindows.py", line 29, in <module>
  File "<frozen importlib._bootstrap>", line 2237, in _find_and_load
  File "<frozen importlib._bootstrap>", line 2226, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 1191, in _load_unlocked
  File "<frozen importlib._bootstrap>", line 1161, in _load_backward_compatible
  File "C:\Python34\lib\site-packages\PyInstaller\loader\pyimod03_importers.py", line 389, in load_module
    exec(bytecode, module.__dict__)
  File "site-packages\pandas\__init__.py", line 7, in <module>
  File "<frozen importlib._bootstrap>", line 2237, in _find_and_load
  File "<frozen importlib._bootstrap>", line 2226, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 1191, in _load_unlocked
  File "<frozen importlib._bootstrap>", line 1161, in _load_backward_compatible
  File "C:\Python34\lib\site-packages\PyInstaller\loader\pyimod03_importers.py", line 573, in load_module
    module = loader.load_module(fullname)
  File "pandas\tslib.pyx", line 55, in init pandas.tslib (pandas\tslib.c:102924)
  File "<frozen importlib._bootstrap>", line 2237, in _find_and_load
  File "<frozen importlib._bootstrap>", line 2226, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 1191, in _load_unlocked
  File "<frozen importlib._bootstrap>", line 1161, in _load_backward_compatible
  File "C:\Python34\lib\site-packages\PyInstaller\loader\pyimod03_importers.py", line 389, in load_module
    exec(bytecode, module.__dict__)
  File "dateutil\zoneinfo\__init__.py", line 31, in <module>
  File "dateutil\zoneinfo\__init__.py", line 24, in getzoneinfofile
FileNotFoundError: [WinError 3] The system cannot find the path specified: 'C:\Users\OrangeFlash81\AppData\Local\Temp\_MEI102122\dateutil\zoneinfo'
test returned -1

我知道 cx_Freeze 在导入 dateutil 时有问题,此错误消息引用了 dateutilpyinstaller 是否遇到同样的问题,如果是,我该如何解决?

这不完全是一个解决方案,但我决定改用 XLRD 模块,它可以完成我需要的一切,并且可以完美地与 pyinstaller 一起工作;更改 xlwings 代码以使用 XLRD 也不是太困难。