pyinstaller, cx_Freeze打包 pyqt 桌面应用-实操

news2024/11/28 16:51:47

1 pyinstaller 打包成 exe

参考这个连接, 写的比较全面: https://blog.csdn.net/qq_48979387/article/details/132359366

唯一发现一个错误是增加资源文件时候的分隔符(-add-data SOURCE:DEST), 按照自己环境的实际的情况来:

$ pyinstaller --help
usage: pyinstaller [-h] [-v] [-D] [-F] [--specpath DIR] [-n NAME] [--contents-directory CONTENTS_DIRECTORY] [--add-data SOURCE:DEST] [--add-binary SOURCE:DEST] [-p DIR] [--hidden-import MODULENAME]      
                   [--collect-submodules MODULENAME] [--collect-data MODULENAME] [--collect-binaries MODULENAME] [--collect-all MODULENAME] [--copy-metadata PACKAGENAME]
                   [--recursive-copy-metadata PACKAGENAME] [--additional-hooks-dir HOOKSPATH] [--runtime-hook RUNTIME_HOOKS] [--exclude-module EXCLUDES] [--splash IMAGE_FILE]
                   [-d {all,imports,bootloader,noarchive}] [--optimize LEVEL] [--python-option PYTHON_OPTION] [-s] [--noupx] [--upx-exclude FILE] [-c] [-w]
                   [--hide-console {hide-early,minimize-late,hide-late,minimize-early}] [-i <FILE.ico or FILE.exe,ID or FILE.icns or Image or "NONE">] [--disable-windowed-traceback] [--version-file FILE]
                   [-m <FILE or XML>] [-r RESOURCE] [--uac-admin] [--uac-uiaccess] [--argv-emulation] [--osx-bundle-identifier BUNDLE_IDENTIFIER] [--target-architecture ARCH]
                   [--codesign-identity IDENTITY] [--osx-entitlements-file FILENAME] [--runtime-tmpdir PATH] [--bootloader-ignore-signals] [--distpath DIR] [--workpath WORKPATH] [-y] [--upx-dir UPX_DIR]    
                   [--clean] [--log-level LEVEL]
                   scriptname [scriptname ...]


如果我们的项目知识纯python 脚本, 没有配置文件, 资源文件等外部依赖, 那么pyinstaller的配置参数相对简洁

pyinstaller -F -w   your_main_script

参数 -F的意思是 将所有的文件(python的脚本和如干依赖文件打包成一个 exe), 如果不加这个参数, 会将程序大包围一个exe文件和一个文件夹(里面包含需要的依赖文件)
参数-w 控制是否显示 console, 加上这个参数表示不显示控制台, 去掉表示显示控制台

下面给我我自己实践的一个过程。 我的项目是利用pyqt做了一个应用界面, 其中包含三个python脚本: 一个主程序外加两个绘制Ui python 脚本, 所需要的图片和数据资源, 具体目录如下:
在这里插入图片描述

上面的参考文件着重说了, 如果脚本涉及到数据文件引用的情况, 要注意目录路径的使用, 因为打包成exe后, 数据目录相对路径会变化的, 所以给出解决方案是:

def get_path(relative_path):
    try:
        base_path = sys._MEIPASS # pyinstaller打包后的路径
    except AttributeError:
        base_path = os.path.abspath(".") # 当前工作目录的路径
 
    return os.path.normpath(os.path.join(base_path, relative_path)) # 返回实际路径

具体使用上, 我的数据文件的引用方式:

            engine_config_path = get_path('./engine_config.json')
            engine_config_path = Path(engine_config_path)

当然我的代码还包含图像文件, 使用方式都是类似的。

1.1 执行命令行方式打包

pyinstaller  -w --add-data=Images:Images --add-data=engine_data:engine_data  chess_validate_main.py

输出如下:

$ pyinstaller  -w --add-data=Images:Images --add-data=engine_data:engine_data  chess_validate_main.py
506 INFO: PyInstaller: 6.6.0, contrib hooks: 2024.6
506 INFO: Python: 3.10.11
543 INFO: Platform: Windows-10-10.0.19045-SP0
545 INFO: wrote D:\python_project_2\chess_validate_tool\chess_validate_main.spec
548 INFO: Extending PYTHONPATH with paths
['D:\\python_project_2\\chess_validate_tool']
1017 INFO: Appending 'datas' from .spec
1019 INFO: checking Analysis
1019 INFO: Building Analysis because Analysis-00.toc is non existent
1019 INFO: Running Analysis Analysis-00.toc


.....


8741 INFO: checking COLLECT
8741 INFO: Building COLLECT because COLLECT-00.toc is non existent
8742 INFO: Building COLLECT COLLECT-00.toc
8977 INFO: Building COLLECT COLLECT-00.toc completed successfully.

这样dist 目录下会出现 如下的文件
在这里插入图片描述

1.2

执行完pyinstaller 命令后, 可以看到在当前目录下有一个 spec文件, 内容如下:

# -*- mode: python ; coding: utf-8 -*-


a = Analysis(
    ['chess_validate_main.py'],
    pathex=[],
    binaries=[],
    datas=[('Images', 'Images'), ('engine_data', 'engine_data')],
    hiddenimports=[],
    hookspath=[],
    hooksconfig={},
    runtime_hooks=[],
    excludes=[],
    noarchive=False,
    optimize=0,
)
pyz = PYZ(a.pure)

exe = EXE(
    pyz,
    a.scripts,
    [],
    exclude_binaries=True,
    name='chess_validate_main',
    debug=False,
    bootloader_ignore_signals=False,
    strip=False,
    upx=True,
    console=False,
    disable_windowed_traceback=False,
    argv_emulation=False,
    target_arch=None,
    codesign_identity=None,
    entitlements_file=None,
)
coll = COLLECT(
    exe,
    a.binaries,
    a.datas,
    strip=False,
    upx=True,
    upx_exclude=[],
    name='chess_validate_main',
)

这个就是我们打包的一个配置文件, 如果需求可以直接修改所需配置, 然后执行:

pyinstaller xx.spec

当然这个文件可以提前用单独的命令来生成:

 pyi-makespec.exe   chess_validate_main.py

1.3 问题

由于我的程序在运行过程中, 引用了第三方的一个 exe文件, 在打包完成后测试的过程中发现程序运行异常,不是我期望的运行表现,原因为: 上述打包过程禁用了console, 然而程序在打开第三方exe的时候没有禁用console, 导致了冲突, 修改源码在打开第三方程序的时候直接禁用console. 再重新打包, 运行正常。

2 cx_Freeze

直接安装 cx_freeze

 pip install cx-freeze 

安装成功后, 先看看需要哪些参数:

$ cxfreeze -h
usage: cxfreeze [--script NAME] [--init-script NAME] [--base NAME] [--target-name NAME] [--icon NAME] [--manifest NAME] [--uac-admin] [--uac-uiaccess] [--shortcut-name NAME] [--shortcut-dir DIR]
                [--copyright COPYRIGHT] [--trademarks TRADEMARKS] [--version]
                [COMMAND]

Freeze a Python script and all of its referenced modules to a base executable which can then be distributed without requiring a Python installation.

positional arguments:
  COMMAND               build, build_exe or supported bdist commands (and to be backwards compatible, can replace --script option)

options:
  --script NAME         the name of the file containing the script which is to be frozen
  --init-script NAME    script which will be executed upon startup; if the name of the file is not an absolute file name, the subdirectory initscripts (rooted in the directory in which the cx_Freeze        
                        package is found) will be searched for a file matching the name
  --base NAME, --base-name NAME
                        the name of the base executable; the pre-defined values are: "console" (default), "gui" and "service"; a user-defined base is accepted if it is given with an absolute path name      
  --target-name NAME    the name of the target executable; the default value is the name of the script; it is recommended NOT to use an extension (automatically added on Windows); target-name with version  
                        is supported; if specified a path, raise an error
  --icon NAME           name of icon which should be included in the executable itself on Windows or placed in the target directory for other platforms; it is recommended NOT to use an extension
                        (automatically added ".ico" on Windows, ".icns" on macOS and ".png" or ".svg" on Linux and others)
  --manifest NAME       name of manifest which should be included in the executable itself (Windows only)
  --uac-admin           creates a manifest for an application that will request elevation (Windows only)
  --uac-uiaccess        changes the application manifest to bypass user interface control (Windows only)
  --shortcut-name NAME  the name to give a shortcut for the executable when included in an MSI package (Windows only)
  --shortcut-dir DIR    the directory in which to place the shortcut when being installed by an MSI package; see the MSI Shortcut table documentation for more information on what values can be placed here  
                        (Windows only)
  --copyright COPYRIGHT
                        the copyright value to include in the version resource associated with executable (Windows only)
  --trademarks TRADEMARKS
                        the trademarks value to include in the version resource associated with the executable (Windows only)
  --version             show program's version number and exit

Note:
    * Windows only options are ignored by other OS and when used by Python app from Microsoft Store.

Additional help:
    cxfreeze build_exe --help

Linux and similar OS:
    cxfreeze bdist_appimage --help
    cxfreeze bdist_deb --help
    cxfreeze bdist_rpm --help
macOS:
    cxfreeze bdist_dmg --help
    cxfreeze bdist_mac --help
Windows:
    cxfreeze bdist_msi --help

为了快速验证, 直接执行下面的命令

cxfreeze --base-name=gui  --script chess_validate_main.py

运行结束后, 可以看到在build 目录有我需要的exe.
在这里插入图片描述
但是没有程序运行需要的资源文件, 需要手动copy Images 和 engine_data 到 exe所在的目录。

测试, 一下, 完美运行,由于在pyinstaller执行过的例子后实验, 相关坑已经踩过, 本次没有遇到任何问题。
附上运行截图
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1851357.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CS162 Operating System-lecture2

A tread is suspended or no longer executing when its state’s not loaded in registers the point states is pointed at some other thread .so the thread that’s suspended is actually siting in memory and not yet executing or not executing at all with some thi…

探索Linux的奇妙世界:第二关---Linux的基本指令1

1. xshell与服务器的连接 想必大家在看过上一期视频时已经搭建好了Linux的环境了并且已经下好了终端---xshell了吧?让我来带大家看一看下好了是什么样子的: 第一次登陆会让你连接你的服务器,就是我们买的云服务器,买完之后需要把公网地址ip复制过来进行链接,需要用户名和密码连…

Node.js 渲染三维模型并导出为图片

Node.js 渲染三维模型并导出为图片 1. 前言 本文将介绍如何在 Node.js 中使用 Three.js 进行 3D 模型渲染。通过结合 gl 和 canvas 这两个主要依赖库&#xff0c;我们能够在服务器端实现高效的 3D 渲染。这个方法解决了在服务器端生成和处理 3D 图形的需求&#xff0c;使得可…

intouch的报警怎么发到企业微信机器人

厂务报警通知系列博客目录 intouch的报警怎么发到微信上 intouch的报警怎么发到邮件上 intouch的报警怎么发到短信上 intouch的报警怎么发到企业微信机器人 intouch的报警怎么发到飞书机器人 intouch的报警怎么用语音通知到手机用户 创建企业微信群机器人 打开企业微信客…

idea导入项目右侧maven不显示的解决办法

不显示情况&#xff1a; 原因可能是读取项目出错&#xff0c;未正确加载pom文件造成的。 解决方案一&#xff1a; 关闭idea在项目目录中删除.idea文件夹重新打开项目&#xff0c;重新加载。 解决犯案二&#xff1a; 直接在pom文件中右键选择add as maven project。 解决方案三…

【会议征稿,JPCS出版】第三届电力系统与能源技术国际学术会议(ICPSET 2024,7月5-7)

第三届电力系统与能源技术国际学术会议&#xff08;ICPSET 2024&#xff09;将于2024年7月5-7日在杭州举办。由浙江水利水电学院电机产业学院主办&#xff0c;AEIC学术交流中心承办&#xff0c;湖州市南浔创新研究院、南浔区科技局&#xff08;科协&#xff09;协办 。会议主要…

2024年全国青少信息素养大赛python编程复赛集训第九天编程题分享

整理资料解析答案非常不容易,感谢各位大佬给个点赞和分享吧,谢谢 今天题目较简单:适合小学组 大家如果不想阅读前边的比赛内容介绍,可以直接跳过:拉到底部看集训题目 (一)比赛内容: 【小学组】 1.了解输入与输出的概念,掌握使用基本输入输出和简单运算 为主的标准…

基于SpringBoot+Vue大学生网络教学平台设计和实现(源码+LW+调试文档+讲解等)

&#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN作者、博客专家、全栈领域优质创作者&#xff0c;博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f31f;文末获取源码数据库&#x1f31f; 感兴趣的可以先收藏起来&#xff0c;…

LeetCode26. 删除有序数组中的重复项题解

LeetCode26. 删除有序数组中的重复项题解 题目链接&#xff1a; https://leetcode.cn/problems/remove-duplicates-from-sorted-array 题目描述&#xff1a; 给你一个 非严格递增排列 的数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使每个元素 只出现一…

Android记录3--ExpandableListView使用+获取SIM卡状态信息

布局文件&#xff1a; /SIM_Card_Demo/res/layout/inbox.xml <LinearLayout xmlns:android“http://schemas.android.com/apk/res/android” xmlns:tools“http://schemas.android.com/tools” android:layout_width“match_parent” android:layout_height“match_par…

终于找到了免费的云服务器

今天朋友推荐了一个免费的云服务器&#xff1a;“阿贝云” 我最喜欢的是它的"免费虚拟主机"“免费云服务器”&#xff0c;省了我好多钱&#xff0c;我的使用感受是用起来经济实惠省心&#xff0c;不要钱的东西谁不喜欢呢&#xff0c;对于普通开发者来说&#xff0c;…

Linux-PXE批量安装

一、部署 PXE 远程安装服务 在大规模的 Linux 应用环境中&#xff0c;如 Web 群集、分布式计算等&#xff0c;服务器往往并不配备光驱设备&#xff0c;在这种情况下&#xff0c;如何为数十乃至上百台服务器裸机快速安装系统呢&#xff1f;传统的 USB光驱、移动硬盘等安装方法显…

使用Mixamo极简绑骨,导入unity中使用

如果你只想专注于角色建模&#xff0c;对于动画设计没有过多精力&#xff1b;如果你想白嫖别人的角色动画&#xff0c;用到自己的模型上&#xff1b;那么&#xff0c;这个网站很适合你&#xff1a;https://www.mixamo.com/ 操作步骤&#xff1a; 首先将自己的模型上传到这个网…

EOS black灵魂回响黑色无法联机/联机报错/联机失败怎么办

灵魂回响黑色EOS black中的职业系统&#xff0c;自由度非常高。从人物属性的精细调整&#xff0c;到装备属性的独特搭配&#xff0c;再到技能的个性化组合&#xff0c;每一步都充满了无限可能。更为惊喜的是&#xff0c;游戏中的角色职业不是一成不变的&#xff0c;而是随着手中…

公共网络IP地址不正确?别担心,这里有解决方案

在数字化时代&#xff0c;公共网络IP地址的正确性对于我们的在线体验至关重要。它不仅是网络连接的标识&#xff0c;更是确保我们正常访问互联网资源、享受网络服务的基础。然而&#xff0c;有时我们可能会遇到公共网络IP地址不正确的情况&#xff0c;这不仅会影响我们的网络速…

为什么五笔没人用了?

五笔输入法现在较少人使用的原因主要有以下几点&#xff1a; 学习门槛高&#xff1a;五笔输入法的学习难度相对较大&#xff0c;需要掌握所有的字根&#xff0c;全面了解编码的规律&#xff0c;并学习每个字的拆字原则&#xff0c;这要求用户有相当高的耐心和时间去学习和练习…

python自动化办公工具:自动批量生成奖状的工具(可视化)

&#x1f446;点击关注 获取更多编程干货&#x1f446; 不知道大家有没有注意到一种趋势&#xff0c;现在即便是那些非程序员&#xff0c;甚至对计算机一窍不通的人&#xff0c;也开始学习Python了&#xff0c;其“普及程度”实在让人感到有些惊讶。 那么&#xff0c;对于那些…

用RNN构建人名分类器

目录 项目综述1.导入必备的工具包2.处理数据&#xff0c;满足训练要求2.1 统计常用的字符2.2 进行规范化处理,去除重音符号2.3 将文件读取到内存中2.4 构建人名国家和具体人名的对应关系2.5 one-hot编码 3.构建RNN模型3.1 构建传统RNN模型3.2 构建传统LSTM模型3.3 构建传统GRU模…

springboot学习01-[springboot介绍、配置文件介绍、自动配置读取原理]

springboot介绍、配置文件介绍、自动配置读取原理 springBoot学习代码说明为什么java -jar springJar包后项目就可以启动 配置文件介绍配置文件加载顺序其他约定配置文件加载顺序profile配置文件加载配置文件绑定类属性通过Value的方式进行属性注入通过ConfigurationProperties…

Springboot 集成 Shardingsphere-JDBC

Springboot 集成 Shardingsphere-JDBC Shardingsphere系列目录&#xff1a;背景前提新增依赖分表策略简单分库分表策略垂直分库广播表水平分库(单表)水平分库(多表)水平分表 HINT配置逻辑代码 自定义分库分表&#xff08;精准定位范围查询&#xff09;配置代码精准定位数据库精…