zoukankan      html  css  js  c++  java
  • pyinstaller模块

    pyinstaller打包图标资源失效解决方式

    1、安装所需要的pip包

    pip install pyinstaller
    pip install pyqt5-tools
    

    2、使用qrc配置静态资源
    1)Qt中的qrc文件是一个xml格式的资源配置文件,qrc文件可以用安装了Qt的vs生成也可以手写,格式如下:

    <RCC>
        <qresource prefix="/">
            <file>文件名</file>
            #多少个文件写多少行
        </qresource>
    </RCC>
    

    2)新建文件resource.qrc

    <RCC>
        <qresource prefix="/">
            <file>favicon.ico</file>
            <file>xiaoxi.svg</file>
        </qresource>
    </RCC>
    

    3)使用pyrcc5将qrc文件转为py文件,只要安装了pyqt5-tools,pyrcc5.exe就在python安装目录下的Scripts目录下:

    pyrcc5.exe -o resource.py resource.qrc
    

    4)在需要的地方使用

    pyinstaller打包报错合集以及解决方案

    以下解决方案中存在使用spec文件打包的方式,需要执行命令:pyinstaller -D xxx.spec,后面携带的任何参数都不会生效,需要进入到xxx.spec文件中,修改文件(只是把命令里携带的参数改为在spec文件中而已)。

    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:pythonfile.py
    

    ModuleNotFoundError: No module named ‘win32com’

    错误信息:

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

    解决方式:安装pypiwin32的包

    pip install pypiwin32
    

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

    错误信息:

    15379 INFO: Loading module hook "hook-win32com.py"...
    e:python38venvlibsite-packageswin32comclientmakepy.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 != ‘’。算是警告吧。

    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也不会引起程序有什么问题,就没管了。

    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','.')]
    

    使用 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’],应该是没有找到这个文件。

    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,我是直接进 python38venvLibsite-packagespyzbar 找到pyzbar安装位置,里面刚好有这两个dll,把它复制出来到exe同目录下。 这里应该可以不复制文件,直接添加路径的
    

    TypeError: ‘NoneType’ object is not subscriptable

    错误信息:

    TypeError: 'NoneType' object is not subscriptable
    

    解决方式:

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

    pyinstaller打包32位程序

    目前还有一些电脑是32位的操作系统,但大多数情况下,基本普遍已经都是64位的操作系统,因此我们的64位电脑上安装的软件也基本上都是64位的软件,打包出来的程序也是64位,放在32位的操作系统上没办法去运行。(当然32位的软件放在64位的系统上是没有问题的,向下兼容。)

    实现方式:
    不需要更换操作系统,只需要把python环境改为32位的,再重新安装所用到的库即可。

    实现步骤:
    1、下载安装32位的python软件
    2、使用pip安装32位的pyinstaller

    pip install pyinstaller
    

    3、重新安装所用的第三方模块
    4、执行打包命令

    pyinstaller -F -w -i xxx.ico main.py
    

    使用pip安装pyinstaller没有环境变量,可以使用pip uninstall pyinstaller 会列出pyinstaller的安装全路径。然后选择不卸载,复制全路径去执行命令。

  • 相关阅读:
    Mybatis整理
    Spring获取json和表单
    Mqtt(paho)重连机制
    Redis无法获取资源(Could not get a resource from the pool)
    SSM+Maven+Redis框架学习
    第一章 Zookeeper理论基础
    RocketMQ和Kafka对比
    Kafka工作原理与过程
    Kafka介绍
    JVM调优
  • 原文地址:https://www.cnblogs.com/cnhyk/p/13926005.html
Copyright © 2011-2022 走看看