只是在我使用它们时总结一下这里的选项。
PyInstaller TOC - 是,如文档所述:
TOC 似乎是形式为(名称、路径、类型代码)的元组列表。事实上,它是一个有序集合,而不是一个列表。TOC 不包含重复项,其唯一性仅基于名称。
换句话说,简单地说:
a_toc = [('uname1','/path/info','BINARY'),('uname2','/path/to','EXTENSION')...]
因此,在您的 .spec 文件中 - 一旦您获得了脚本的分析结果 - 您可以通过以下任一方式进一步修改相应的 TOC:
(*顺便说一句,要使差异起作用,您似乎必须显式转换为TOC()
并注意,由于它只是唯一定义集合元素的名称,因此您只需要指定 - 因此('sqlite3', None, None)
等等)
下面是一个说明性示例(取自 .spec 文件)——无论好坏——我删除了对 scipy、IPython 和 zmq 的所有引用;删除特定的 sqlite、tcl/tk 和 ssl .DLL;插入缺少的 opencv .DLL;最后删除除matplotlib之外的所有数据文件夹......
当 .pyc 文件尝试加载预期的 .DLL 时,生成的 Pyinstaller .exe 是否可以工作尚无定论:-/
# Manually remove entire packages...
a.binaries = [x for x in a.binaries if not x[0].startswith("scipy")]
a.binaries = [x for x in a.binaries if not x[0].startswith("IPython")]
a.binaries = [x for x in a.binaries if not x[0].startswith("zmq")]
# Target remove specific ones...
a.binaries = a.binaries - TOC([
('sqlite3.dll', None, None),
('tcl85.dll', None, None),
('tk85.dll', None, None),
('_sqlite3', None, None),
('_ssl', None, None),
('_tkinter', None, None)])
# Add a single missing dll...
a.binaries = a.binaries + [
('opencv_ffmpeg245_64.dll', 'C:\\Python27\\opencv_ffmpeg245_64.dll', 'BINARY')]
# Delete everything bar matplotlib data...
a.datas = [x for x in a.datas if
os.path.dirname(x[1]).startswith("C:\\Python27\\Lib\\site-packages\\matplotlib")]