如标题所述:;我有一个由 pyinstaller 生成的“小”python exe GUI 程序,它创建了一个包含 820 个文件(主要是 tzdata)的 tcl 文件夹。有机会减少这个数字吗?
由于文件很小,复制程序需要很长时间。
我使用了日期时间库。我只需要在我正在打印的 pdf 上弹出日期和时间,所以不需要那么花哨。我只需要花在电脑上的时间:)
我可以使用“--onefile”来获取 .exe,但这需要很长时间才能打开。
程序仅适用于Windows atm。
您几乎肯定可以直接删除
http1.0
和 opt0.4
目录。它们是过时的软件包,仅用于向后兼容。
应保留
*.tcl
和 tclIndex
文件(parray.tcl
除外,您可能不需要)。
在
encoding
、msgs
和 tzdata
目录中,如果您要在一组受限制的位置进行部署,则可以删除其中的大部分内容;您只需要运行时实际使用的编码、消息目录和时区定义。因此,如果您仅支持美国的英语使用者,则可以删除很大一部分文件。 (如果您根本不使用 Tcl 来格式化或解析日期,则不需要任何时区定义。)您必须保留的主要编码是编写脚本所用的编码! (注意:对 UTF-8 和 ISO8859-1 编码的支持,以及用于与 Windows API 对话的 UTF-16 派生编码,都是直接内置于 Tcl 中的;您无法删除对它们的支持。)
您可以删除哪些内容取决于您的应用程序以及部署它的位置。这就是为什么我们无法直接告诉您要删除哪些文件。
通常,“生硬”的方法是通过删除文件(或某些文件)来解决问题,并查看您的程序是否按预期工作而没有任何错误。这有时可能相当复杂且耗时,有时甚至不可能。 像 pyinstaller 和 cx_freeze 这样的库往往包含您甚至不需要的文件,因此保证程序可以正常工作。
一般来说,我建议您为您的程序创建一个安装程序(例如 Inno Setup),它看起来确实更专业,并且会减少您当前的问题。
Python还支持压缩库,这些库可以大大减少某些库上应用程序的大小。看看我自己关于主题的问题之一Python3编译的应用程序通过zip减少大小?.
玩得开心!
如果您不介意添加本机动态库(dll/so),您可以使用 Tcl 扩展
tclvfs
,并将这 820 个文件存储在 zip 文件中。
AFAIK,
tclvfs
不会将文件提取到临时目录,如 pyinstaller 的“--onefile”(除非您尝试加载本机扩展),所以它应该很快。
您可以从 source 进行构建,也可以从 msys2 获取 Windows 二进制文件。 msys2 二进制文件有点过时(从 2013 年开始),但仍然可以工作。
将包解压到tcl目录下。您只需要
pkgIndex.tcl
、vfs.tcl
、vfs142.dll
、vfslib.tcl
、vfsUtils.tcl
和 zipvfs.tcl
来安装 zip 文件。将它们放在.../tcl/tclvfs
下。
将
tcl
目录下的所有原文件打包到library.zip
中。您可以对 tk
(在 tk
目录下)执行相同操作。
这些文件需要保留在
tcl
目录中: init.tcl
、package.tcl
、tclIndex
、tm.tcl
(用于加载包)。
init.tcl
将以下内容添加到
init.tcl
以加载library.zip
。
package require vfs::zip
# mount library.zip
vfs::zip::Mount [file join $::tcl_library library.zip] $::tcl_library
# reload index
auto_load_index
现在您有 11 个文件,而不是 820 个。