Numpy使用Py2exe创建tcl文件夹的问题
在本文中,我们将介绍在使用Py2exe创建Python程序可执行文件时,由于Numpy库的一些特殊性,可能会创建一个名为“tcl”的文件夹的问题,并提供解决方案。
阅读更多:Numpy 教程
问题描述
当我们构建基于Numpy库的Python程序的可执行文件时,使用Py2exe打包项目通常不会出现问题。然而,在某些情况下,这样做可能会导致一个奇怪的问题。我们会发现,除了程序可执行文件之外,还会创建一个名为“tcl”的文件夹,如下所示:
|-dist
| |-tcl
| |-numpy.dll
| |-library.zip
| |-...
| |-main.exe
这个文件夹似乎没有什么用处,但随着Python程序的规模变得越来越大,它最终可能会变得非常大,很快就会占用大量的磁盘空间。同时,当我们想要将程序项目分享给其他人时,会出现文件夹无法删除的情况。
问题原因
这个问题的罪魁祸首是Numpy库,它会在程序执行期间动态创建和加载tcl / tk库,这些库用于绘制GUI。当使用Py2exe生成可执行文件时,tcl和tk库被打包到了可执行文件中,因为Py2exe无法识别并打包这些库。
这就是为什么Py2exe会在生成可执行文件的同时创建一个名为tcl的文件夹。tcl文件夹中包含了Numpy库所需的动态链接库。
解决方案
解决这个问题的方法很简单。我们需要手动将tcl文件夹复制到与我们的程序exe文件相同的目录中。我们可以使用以下代码行将此操作自动添加到我们的setup.py文件中:
import os
import shutil
import numpy.core._dummy as np # 将 numpy库 随便导入一下即可(如果你的代码中需要用到numpy库,那就更好了)
dll_path = os.path.join(os.path.dirname(np.__file__), 'tcl')
shutil.copytree(dll_path, os.path.join('dist', 'tcl'))
这段代码做了以下几件事情:
-找到当前numpy的DLL文件夹.
-将文件夹复制到我们生成的dist目录中(即‘main.exe’附近)
这样,当我们运行Py2exe生成的可执行文件时,tcl文件夹会在程序的文件夹中进行动态链接,避免了在本地创建新文件夹的问题。
总结
Numpy库的特殊性导致在使用Py2exe生成Python可执行文件时会出现一个名为“tcl”的文件夹。这个问题可以通过手动将tcl文件夹复制到我们的程序exe文件所在的目录中来解决。虽然这个问题看起来不是很重要,但如果我们不处理,它最终可能会导致磁盘空间不足和文件组织混乱等问题。