python 使用pyinstaller 打包程序的心得(踩过的坑)

Error_1

ValueError: Can’t mix absolute and relative paths

E:\python>pyinstaller -F file.py

Traceback (most recent call last):
"""省略一万字"""
ValueError: Can't mix absolute and relative paths

解决方法:修改命令中目标文件路径为绝对路径。

E:\python>pyinstaller -F E:\python\file.py

Error_2

ModuleNotFoundError: No module named ‘win32com’

Traceback (most recent call last):
  File "", line 2, in <module>
ModuleNotFoundError: No module named 'win32com'

解决方法:pip install pypiwin32

pip install pypiwin32

Error_3

SyntaxWarning: “is not” with a literal. Did you mean “!=”?

15379 INFO: Loading module hook "hook-win32com.py"...
e:\python38\venv\lib\site-packages\win32com\client\makepy.py:369: 
SyntaxWarning: "is not" with a literal. Did you mean "!="?
  if path is not '' and not os.path.exists(path):

解决办法:找到makepy.py:369行,把 if path is not ''改成 if path != ‘’ 。算是警告吧。

Error_4

WARNING: Hidden import “sip” not found!

12659 INFO: Loading module hook "hook-PyQt5.py"...
12778 WARNING: Hidden import "sip" not found!
12778 INFO: Loading module hook "hook-PyQt5.QtCore.py"...

解决方法:
(1)尝试过,pip install sip,然后文件中 import sip再打包,好像没用
(2)尝试过,pyinstaller 命令中添加 --hidden-import sip或者 --hidden-import PyQt5.sip,没用+1
(3)没有进行尝试,在spec文件中的 hiddenimports=[‘sip’],或者hiddenimports=[‘PyQt5’,‘PyQt5.sip’],不知道有没有效,但是此方式很有用!(因为暂时不知道是缺少sip库还是PyQt5.sip模块) 但是后面发现这个warning也不会引起程序有什么问题,就没管了。

Error_5

ValueError: too many values to unpack (expected 2)

INFO: Appending 'datas' from .spec
Traceback (most recent call last):
"""
"""
ValueError: too many values to unpack (expected 2)

解决办法:使用spec文件进行打包,在datas中添加了一个同路径下的配置文件时,因为没有加 () 出现了这个错误,要记得datas里面是set()

datas=[('config.ini','.')]

Error_6

使用 pyinstaller -F 进行打包,运行exe文件,命令行窗口消失太快——打开cmd或者在pycharm terminal里来运行exe文件。
出现一连串报错(这个程序里用了mysql.connector连接mysql数据库)

OSError: [WinError 10038] 在一个非套接字上尝试了一个操作。
ModuleNotFoundError: No module named 'mysql.connector.locales.eng'
ImportError: No localization support for language 'eng'
TypeError: catching classes that do not inherit from BaseException is not allowed

解决方法:使用spec文件打包,修改里面的 hiddenimports=[‘mysql’,‘mysql.connector.locales.eng.client_error’],应该是没有找到这个文件。

Error_7

FileNotFoundError: Could not find module ‘libiconv-2.dll’. Try using the full path with constructor syntax.

FileNotFoundError: Could not find module 'libiconv-2.dll'. Try using the full path with constructor syntax.
__main__.PyInstallerImportError: Failed to load dynlib/dll 'libiconv-2.dll'. Most probably this dynlib/dll was not found when the application was frozen.
__main__.PyInstallerImportError: Failed to load dynlib/dll 'C:\\Users\\用户\\AppData\\Local\\Temp\\_MEI63362\\pyzbar\\libiconv-2.dll'. Most probably this dynlib/dll was not found when the application was frozen.

解决方法:原因是程序里使用了pyzbar,但是没有找到 libiconv-2.dll 和 libzbar-32.dll,我是直接进 python38\venv\Lib\site-packages\pyzbar 找到pyzbar安装位置,里面刚好有这两个dll,把它复制出来到exe同目录下。 这里应该可以不复制文件,直接添加路径的。

Error_8

TypeError: ‘NoneType’ object is not subscriptable

TypeError: 'NoneType' object is not subscriptable

解决方法:检查是否有不该用下标访问的变量用了下标访问,比如a=1,a[0],但是我这里的问题应该是变量还没初始化,就调用了下标,加一个try-except,先让程序运行起来把变量初始化了就行了。

你可能感兴趣的:(python 使用pyinstaller 打包程序的心得(踩过的坑))