PyInstaller 生成的 exe 不起作用,项目使用 ReportLab

问题描述 投票:0回答:3

我正在尝试为我的项目生成一个 exe。大约一个月前,当我的项目没有使用 ReportLab 时,它可以正常工作,但现在情况就不那么严重了。

经过搜索,我发现问题是其中一个 pyinstaller 文件中的 缺少导入。 问题解决了吗?不完全是。

现在我收到此错误...

Traceback (most recent call last):
File "<string>", line 18, in <module>
File "F:\Python\pyinstaller-2.0\pyinstaller-2.0\PyInstaller\loader\iu.py", line 386, in importHook 
mod = _self_doimport(nm, ctx, fqname)
File "F:\Python\pyinstaller-2.0\pyinstaller-2.0\PyInstaller\loader\iu.py", line 480, in doimport
exec co in mod.__dict__
File "F:\Python\pyinstaller-2.0\pyinstaller-2.0\myproject\build\pyi.win32\myproject\out00-PYZ.pyz\reports.My_Report_File", line 10, in <module>
File "F:\Python\pyinstaller-2.0\pyinstaller-2.0\PyInstaller\loader\iu.py", line 431, in importHook
mod = self.doimport(nm, ctx, ctx + '.' + nm)
File "F:\Python\pyinstaller-2.0\pyinstaller-2.0\PyInstaller\loader\iu.py", line 480, in doimport
exec co in mod.__dict__
File "F:\Python\pyinstaller-2.0\pyinstaller-2.0\myproject\build\pyi.win32\myproject\out00-PYZ.pyz\reportlab.pdfgen.canvas", line 25, in <module>
File "F:\Python\pyinstaller-2.0\pyinstaller-2.0\PyInstaller\loader\iu.py", line 431, in importHook
mod = self.doimport(nm, ctx, ctx + '.' + nm)
File "F:\Python\pyinstaller-2.0\pyinstaller-2.0\PyInstaller\loader\iu.py", line 480, in doimport
exec co in mod.__dict__
File "F:\Python\pyinstaller-2.0\pyinstaller-2.0\myproject\build\pyi.win32\myproject\out00-PYZ.pyz\reportlab.pdfbase.pdfdoc", line 22, in <module>
File "F:\Python\pyinstaller-2.0\pyinstaller-2.0\PyInstaller\loader\iu.py", line 431, in importHook
mod = self.doimport(nm, ctx, ctx + '.' + nm)
File "F:\Python\pyinstaller-2.0\pyinstaller-2.0\PyInstaller\loader\iu.py", line 480, in doimport
exec co in mod.__dict__
File "F:\Python\pyinstaller-2.0\pyinstaller-2.0\myproject\build\pyi.win32\myproject\out00-PYZ.pyz\reportlab.pdfbase.pdfmetrics", line 23, in <module>
File "F:\Python\pyinstaller-2.0\pyinstaller-2.0\PyInstaller\loader\iu.py", line 431, in importHook
mod = self.doimport(nm, ctx, ctx + '.' + nm)
File "F:\Python\pyinstaller-2.0\pyinstaller-2.0\PyInstaller\loader\iu.py", line 480, in doimport
exec co in mod.__dict__
File "F:\Python\pyinstaller-2.0\pyinstaller-2.0\myproject\build\pyi.win32\myproject\out00-PYZ.pyz\reportlab.pdfbase._fontdata", line 158, in <module>
File "F:\Python\pyinstaller-2.0\pyinstaller-2.0\PyInstaller\loader\iu.py", line 409, in importHook
raise ImportError("No module named %s" % fqname)
ImportError: No module named _fontdata_enc_winansi

四处搜索,我发现this导致只有一个建议的解决方案,即强制在我的代码文件中导入所有内容。我有太多的报告文件,让我很难考虑这样做。

我读到了一些关于隐藏进口的内容。也许这可以帮助我,但我不知道。任何帮助,将不胜感激。谢谢你。

编辑:py2exe 的类似问题和解决方案....

python pyside reportlab pyinstaller
3个回答
5
投票

我不知道这是否是正确的方法......但我开始拔掉我的头发。

在阅读并浪费了很多时间之后,...

我发现某人的帖子建议复制整个丢失的库文件夹(在我的例子中它位于我的pythonxx的站点包中)到包含exe的文件夹。瓦拉!成功了。

如果有更好/正确的方法来做到这一点,请赐教。


1
投票

将名为

hook-reportlab.pdfbase._fontdata.py
的文件添加到 pyinstaller 的 hooks 子目录中。内容应该是这样的:

hiddenimports = [
    '_fontdata_enc_macexpert',
    '_fontdata_enc_macroman',
    '_fontdata_enc_pdfdoc',
    '_fontdata_enc_standard',
    '_fontdata_enc_symbol',
    '_fontdata_enc_winansi',
    '_fontdata_enc_zapfdingbats',
    '_fontdata_widths_courier',
    '_fontdata_widths_courierbold',
    '_fontdata_widths_courierboldoblique',
    '_fontdata_widths_courieroblique',
    '_fontdata_widths_helvetica',
    '_fontdata_widths_helveticabold',
    '_fontdata_widths_helveticaboldoblique',
    '_fontdata_widths_helveticaoblique',
    '_fontdata_widths_symbol',
    '_fontdata_widths_timesbold',
    '_fontdata_widths_timesbolditalic',
    '_fontdata_widths_timesitalic',
    '_fontdata_widths_timesroman',
    '_fontdata_widths_zapfdingbats']

这对我的 pyinstaller 2.1 有用。顺便说一句,我从默认安装的 pyinstaller 1.5.1 借用了这个文件。


0
投票

最近我在自己的项目中,使用reportlab和tkinter,我不是系统专家,也不是python专家,但我发现我们可以使用下一个代码来导入所有数据:https://coderslegacy.com/ python/tkinter-pyinstaller/

pyinstaller --noconsole --add-data "C:/Desktop/M_Cat_Loaf.jpeg;." mypythonfile.py

在哪里

add data
插入您需要的所有数据文件(例如可爱的猫图片),我不知道
nonconsole
做什么,但它插入到所有需要的文件夹中:D

希望有帮助!

© www.soinside.com 2019 - 2024. All rights reserved.