Python:ftfy在使用pyinstaller,cx_freeze或p2exe编译为exe时导致应用程序崩溃

时间:2016-05-31 01:51:22

标签: python python-3.x pyinstaller py2exe cx-freeze

每当我导入ftfy并在我的python脚本应用程序中使用它时,我都没有任何问题。

如果我使用pyinstallercx_freezepy2exe编译为二进制文件,我的应用程序将编译没有问题,但每次运行应用程序时都会崩溃。

崩溃的原因是它无法从char_classes.dat找到chardata.py文件。

这是我在使用pyinstaller编译后运行应用程序时遇到的典型输出,它崩溃了:

  

文件" C:\ WinPy34 \ python-3.4.3.amd64 \ Lib \ site-
  packages \ PyInstaller \ loader \ pyimod03_importers.py",363行,in   load_module exec(字节码,模块。字典

     

文件   " C:\ WinPy34 \蟒-3.4.3.amd64 \ LIB \站点包\ ftfy \ chardata.py&#34 ;,   第141行,在CHAR_CLASS_STRING =中   zlib.decompress(resource_string(的名称下,   ' char_classes.dat'。))进行解码(' ASCII&#39)

     

文件   " C:\ WinPy34 \蟒-3.4.3.amd64 \ LIB \站点包\ pkg_resources__init __ p   y",第1173行,在resource_string self,resource_name

中      

文件   " C:\ WinPy34 \蟒-3.4.3.amd64 \ LIB \站点包\ pkg_resources__init __ p   y",第1605行,在get_resource_string

中      

return self._get(self._fn(self.module_path,resource_name))

     

文件   " C:\ WinPy34 \蟒-3.4.3.amd64 \ LIB \站点包\ pkg_resources__init __ p   y",第1683行,在_get中        return self.loader.get_data(path)File" C:\ WinPy34 \ python-3.4.3.amd64 \ Lib \ site-packages \ PyInstaller \ loader \ pyimo   d03_importers.py",第445行,在get_data中打开(路径,' rb')为fp:

     

FileNotFoundError:[Errno 2]没有这样的文件或目录:   ' C:\用户\ BILLTH〜1 \鸭   的pData \本地\ TEMP \ _MEI64282 \ ftfy \ char_classes.dat'

     

d2e返回-1

此输出显示它找不到char_classes.dat文件,即使该文件存在 - 如同白天一样 - 在site-packages目录的ftfy模块中。

2 个答案:

答案 0 :(得分:0)

根据您的日志,查找的文件是C:\Users\BILLTH~1\AppData\Local\Temp\_MEI64282\ftfy\char_classes.dat

由于它是一个临时目录,我猜它是提取存档的地方。这些编译器工具创建了一个可自动解压缩的zip存档,它可以在临时文件夹中提取源代码和嵌入式python解释器,设置一些环境变量,并使用正确的参数运行python。

因此,我猜你的char_classes.dat文件没有被该工具嵌入,可能是因为该工具没有看到依赖项。

使用pyinstaller,您可能会发现文档Using Data Files from a Module的部分很有趣,并在您的Analysis调用中添加以下参数:

datas=[('ftfy\char_classes.dat', 'ftfy')]

答案 1 :(得分:0)

我找到了解决此问题的有限方法。

对我来说,我无法让Using Data Files from a Module工作。我也对钩子文件中的任何数据规范都不走运。

但是,它使用我的.spec文件(在运行PyInstaller的工作目录中自动创建)的相对路径来工作。

就我而言

a = Analysis(['ShellClient.py'],
             pathex=['C:\\workspaces\\ScoutSheet\\ScoutSheet\\ScoutSheet.Parsers.NERParsers'],
             binaries=[],
             datas=[
                ("./env/Lib/site-packages/ftfy/char_classes.dat", "ftfy")
             ],
             hiddenimports=["ftfy"],
             hookspath=['.\\PyinstallerHooks'],
             runtime_hooks=[],
             excludes=[],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher)

重要的一行

datas=[
    ("./env/Lib/site-packages/ftfy/char_classes.dat", "ftfy")
],