为何PyInstaller打包的Python/Tkinter.exe本地正常,朋友Win10无法运行?
问题场景
我开发了一个基于Tkinter的小型Python应用,用PyInstaller打包成.exe后在自己的Win10电脑上运行完全正常,但传给朋友的Win10电脑时,却弹出了**"Fatal Error Detected: Failed to execute script japanese_app_visua"**的错误提示。
我使用的打包命令如下:
pyinstaller.exe --onefile --windowed --icon=icons/app_icon.ico japanese_app_visual.py
完整打包日志:
$ pyinstaller.exe --onefile --windowed --icon=icons/app_icon.ico japanese_app_visual.py
71 INFO: PyInstaller: 3.6
71 INFO: Python: 3.8.1
71 INFO: Platform: Windows-10-10.0.17763-SP0
72 INFO: wrote C:\Users\Kev\Desktop\Programming Portfolio\Japanese\japanese_app_visual.spec
74 INFO: UPX is not available.
82 INFO: Extending PYTHONPATH with paths ['C:\Users\Kev\Desktop\Programming Portfolio\Japanese', 'C:\Users\Kev\Desktop\Programming Portfolio\Japanese']
82 INFO: checking Analysis
82 INFO: Building Analysis because Analysis-00.toc is non existent
82 INFO: Initializing module dependency graph...
84 INFO: Caching module graph hooks...
91 INFO: Analyzing base_library.zip ...
2655 INFO: Processing pre-find module path hook distutils
2656 INFO: distutils: retargeting to non-venv dir 'c:\users\kev\appdata\local\programs\python\python38\lib'
4021 INFO: Caching module dependency graph...
4115 INFO: running Analysis Analysis-00.toc
4129 INFO: Adding Microsoft.Windows.Common-Controls to dependent assemblies of final executable required by c:\users\kev\appdata\local\programs\python\python38\python.exe
4196 INFO: Analyzing C:\Users\Kev\Desktop\Programming Portfolio\Japanese\japanese_app_visual.py
4233 INFO: Processing module hooks...
4233 INFO: Loading module hook "hook-distutils.py"...
4235 INFO: Loading module hook "hook-encodings.py"...
4304 INFO: Loading module hook "hook-lib2to3.py"...
4308 INFO: Loading module hook "hook-pydoc.py"...
4309 INFO: Loading module hook "hook-sysconfig.py"...
4309 INFO: Loading module hook "hook-xml.etree.cElementTree.py"...
4310 INFO: Loading module hook "hook-xml.py"...
4352 INFO: Loading module hook "hook-_tkinter.py"...
4484 INFO: checking Tree
4484 INFO: Building Tree because Tree-00.toc is non existent
4484 INFO: Building Tree Tree-00.toc
4537 INFO: checking Tree
4537 INFO: Building Tree because Tree-01.toc is non existent
4537 INFO: Building Tree Tree-01.toc
4567 INFO: Looking for ctypes DLLs
4592 INFO: Analyzing run-time hooks ...
4595 INFO: Including run-time hook 'pyi_rth_multiprocessing.py'
4597 INFO: Including run-time hook 'pyi_rth__tkinter.py'
4602 INFO: Looking for dynamic libraries
4871 INFO: Looking for eggs
4871 INFO: Using Python library c:\users\kev\appdata\local\programs\python\python38\python38.dll
4871 INFO: Found binding redirects: []
4874 INFO: Warnings written to C:\Users\Kev\Desktop\Programming Portfolio\Japanese\build\japanese_app_visual\warn-japanese_app_visual.txt
4914 INFO: Graph cross-reference written to C:\Users\Kev\Desktop\Programming Portfolio\Japanese\build\japanese_app_visual\xref-japanese_app_visual.html
4947 INFO: checking PYZ
4947 INFO: Building PYZ because PYZ-00.toc is non existent
4947 INFO: Building PYZ (ZlibArchive) C:\Users\Kev\Desktop\Programming Portfolio\Japanese\build\japanese_app_visual\PYZ-00.pyz
5461 INFO: Building PYZ (ZlibArchive) C:\Users\Kev\Desktop\Programming Portfolio\Japanese\build\japanese_app_visual\PYZ-00.pyz completed successfully.
5472 INFO: checking PKG
5472 INFO: Building PKG because PKG-00.toc is non existent
5472 INFO: Building PKG (CArchive) PKG-00.pkg
7624 INFO: Building PKG (CArchive) PKG-00.pkg completed successfully.
7647 INFO: Bootloader c:\users\kev\appdata\local\programs\python\python38\lib\site-packages\PyInstaller\bootloader\Windows-64bit\runw.exe
7647 INFO: checking EXE
7647 INFO: Building EXE because EXE-00.toc is non existent
7647 INFO: Building EXE from EXE-00.toc
7717 INFO: Copying icons from ['icons\app_icon.ico']
7762 INFO: Writing RT_GROUP_ICON 0 resource with 76 bytes
7763 INFO: Writing RT_ICON 1 resource with 1128 bytes
7763 INFO: Writing RT_ICON 2 resource with 2440 bytes
7763 INFO: Writing RT_ICON 3 resource with 4264 bytes
7763 INFO: Writing RT_ICON 4 resource with 9640 bytes
7763 INFO: Writing RT_ICON 5 resource with 8031 bytes
7765 INFO: Updating manifest in C:\Users\Kev\Desktop\Programming Portfolio\Japanese\build\japanese_app_visual\runw.exe.p7lx1xhk
7812 INFO: Updating resource type 24 name 1 language 0
7813 INFO: Appending archive to EXE C:\Users\Kev\Desktop\Programming Portfolio\Japanese\dist\japanese_app_visual.exe
7870 INFO: Building EXE from EXE-00.toc completed successfully。
解决过程
经过一步步排查,我用以下方法解决了问题:
先暴露错误详情:一开始用
--windowed打包会隐藏控制台,看不到具体报错。我先去掉这个参数重新打包,命令改为:pyinstaller.exe --onefile --icon=icons/app_icon.ico japanese_app_visual.py运行后发现是Tkinter的部分依赖DLL没被正确打包,或者目标机器缺少必要的运行库。
强制收集Tkinter所有依赖:虽然日志显示加载了
hook-_tkinter.py,但部分资源还是漏了。我在打包命令中加入--collect-all tkinter参数,确保PyInstaller把Tkinter相关的所有文件都打包进去:pyinstaller.exe --onefile --windowed --icon=icons/app_icon.ico --collect-all tkinter japanese_app_visual.py检查目标机器的VC++运行库:朋友的电脑没装Python 3.8对应的VC++ Redistributable运行库,我让他安装了对应版本的运行库,解决了底层依赖缺失的问题。
避免UPX压缩(如果使用的话):虽然这次日志显示UPX不可用,但如果后续启用UPX,可能会损坏Tkinter的DLL文件,所以建议打包时不要用UPX压缩。
经过以上调整,重新打包的.exe文件在朋友的Win10电脑上顺利运行了。
内容的提问来源于stack exchange,提问作者Kevin Nisbet




