我已经开始使用 Pyinstaller 而不是 Py2Exe。但是我很快就遇到了一个问题。如何排除不需要的模块,以及如何查看包含在单个可执行文件中的模块?
我可以从我的 Python 安装的 DLL 文件夹中删除一些 pyd
和 dll
文件,这样 Pyinstaller 就找不到,因此不会包含它们。我真的不想对所有模块都这样做,因为它会变得非常艰巨。
我确实尝试编辑 Pyinstaller 生成的规范文件。
a.binaries - [('ssl','pydoc',)],
但文件的大小保持不变,所以我认为这不起作用。
那么我如何才能看到 Pyinstaller 包含哪些模块以及如何排除那些我不想要的模块呢?
最佳答案
只是在我使用它们时总结这里的选项。
PyInstaller TOC - 如文档所述:
A TOC appears to be a list of tuples of the form (name, path, typecode). In fact, it's an ordered set, not a list. A TOC contains no duplicates, where uniqueness is based on name only.
换句话说,简单地说:
a_toc = [('uname1','/path/info','BINARY'),('uname2','/path/to','EXTENSION')...]
因此,在您的 .spec 文件中 - 一旦您获得了脚本的分析结果 - 您就可以通过以下任一方式进一步修改相应的 TOC:
对于特定文件/模块,使用差分 (-) 和交集 (+) 操作来修改目录。 *
要添加/删除文件/模块的列表,请迭代 TOC 并与模式匹配代码进行比较。
(* 顺便说一句,为了使差异起作用,您似乎必须显式转换为 TOC()
并注意,因为它只是唯一定义集合元素的名称,所以您只需要指定 - 因此 ('sqlite3', None, None)
etc.)
下面是一个说明性示例(取自 .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")]
关于Python:排除模块 Pyinstaller,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4890159/