PyInstaller打包程序通过Windows「打开方式」启动执行失败问题及解决
解决PyInstaller打包GUI程序通过文件关联启动时的Fatal Error问题
问题背景
我需要让自己的Python GUI程序支持通过系统「打开方式」打开.mft格式文件,但遇到了一个奇怪的异常:
- 正常场景:直接双击程序或者通过命令提示符启动时,程序运行完全正常
- 异常场景:右键点击
.mft文件选择「打开方式」,再选中打包后的myexe_to_open_mft.exe时,程序立刻弹出错误:Fatal error, failed to execute script
我使用的PyInstaller打包命令如下:
pyinstaller --windowed -i icon.ico PickleViewer.py
解决方法
经过排查,我通过ctypes库隐藏控制台的方式解决了该问题。推测原因是:当通过文件关联启动程序时,系统的控制台环境初始化出现了冲突,隐藏控制台后规避了这一异常。
完整PyInstaller打包日志
162 INFO: PyInstaller: 3.5 162 INFO: Python: 3.7.4 163 INFO: Platform: Windows-10-10.0.18362-SP0 173 INFO: wrote C:\Users\user\Documents\Python\Documents\pickle_viewer\PickleViewer.spec 177 INFO: UPX is not available. 179 INFO: Extending PYTHONPATH with paths ['C:\\Users\\user\\Documents\\Python\\Documents\\pickle_viewer', 'C:\\Users\\user\\Documents\\Python\\Documents\\pickle_viewer'] 180 INFO: checking Analysis 199 INFO: Building because C:\Users\user\Documents\Python\Documents\pickle_viewer\PickleViewer.py changed 200 INFO: Initializing module dependency graph... 206 INFO: Initializing module graph hooks... 211 INFO: Analyzing base_library.zip ... 5148 INFO: running Analysis Analysis-00.toc 5191 INFO: Adding Microsoft.Windows.Common-Controls to dependent assemblies of final executable required by c:\users\user\appdata\local\programs\python\python37-32\python.exe 8448 INFO: Caching module hooks... 8463 INFO: Analyzing C:\Users\user\Documents\Python\Documents\pickle_viewer\PickleViewer.py 8789 INFO: Loading module hooks... 8789 INFO: Loading module hook "hook-encodings.py"... 8936 INFO: Loading module hook "hook-pydoc.py"... 8938 INFO: Loading module hook "hook-xml.py"... 9298 INFO: Loading module hook "hook-_tkinter.py"... 9871 INFO: checking Tree 9931 INFO: checking Tree 9984 INFO: Looking for ctypes DLLs 9985 INFO: Analyzing run-time hooks ... 9989 INFO: Including run-time hook 'pyi_rth__tkinter.py' 9996 INFO: Looking for dynamic libraries 17315 INFO: Looking for eggs 17316 INFO: Using Python library c:\users\user\appdata\local\programs\python\python37-32\python37.dll 17316 INFO: Found binding redirects: [] 17331 INFO: Warnings written to C:\Users\user\Documents\Python\Documents\pickle_viewer\build\PickleViewer\warn-PickleViewer.txt 17397 INFO: Graph cross-reference written to C:\Users\user\Documents\Python\Documents\pickle_viewer\build\PickleViewer\xref-PickleViewer.html 17499 INFO: checking PYZ 17501 INFO: Building because toc changed 17502 INFO: Building PYZ (ZlibArchive) C:\Users\user\Documents\Python\Documents\pickle_viewer\build\PickleViewer\PYZ-00.pyz 18467 INFO: Building PYZ (ZlibArchive) C:\Users\user\Documents\Python\Documents\pickle_viewer\build\PickleViewer\PYZ-00.pyz completed successfully. 18499 INFO: checking PKG 18501 INFO: Building because C:\Users\user\Documents\Python\Documents\pickle_viewer\build\PickleViewer\PYZ-00.pyz changed 18502 INFO: Building PKG (CArchive) PKG-00.pkg 18549 INFO: Building PKG (CArchive) PKG-00.pkg completed successfully. 18554 INFO: Bootloader c:\users\user\appdata\local\programs\python\python37-32\lib\site-packages\PyInstaller\bootloader\Windows-32bit\runw.exe 18556 INFO: checking EXE 18556 INFO: Building because console changed 18556 INFO: Building EXE from EXE-00.toc 18651 INFO: Copying icons from ['icon.ico'] 18754 INFO: Writing RT_GROUP_ICON 0 resource with 20 bytes 18755 INFO: Writing RT_ICON 1 resource with 22767 bytes 19067 INFO: Appending archive to EXE C:\Users\user\Documents\Python\Documents\pickle_viewer\build\PickleViewer\PickleViewer.exe 19249 INFO: Building EXE from EXE-00.toc completed successfully. 19266 INFO: checking COLLECT WARNING: The output directory "C:\Users\user\Documents\Python\Documents\pickle_viewer\dist\PickleViewer" and ALL ITS CONTENTS will be REMOVED! Continue? (y/N)y 21243 INFO: Removing dir C:\Users\user\Documents\Python\Documents\pickle_viewer\dist\PickleViewer 21736 INFO: Building COLLECT COLLECT-00.toc 33512 INFO: Building COLLECT COLLECT-00.toc completed successfully.
内容的提问来源于stack exchange,提问作者Matix




