python 打包EXE

news2024/11/15 18:26:53

注: 从个人博客园 移植而来

环境: Windows7 Python 2.7

参考:

使用pyinstaller打包python程序

Pyinstaller 打包发布经验总结

Using PyInstaller


简介

使用python引用第三方的各种模块编写一个工具后,如果想发给其他人,他们必须配置相关的环境才能使用,因此将python打包成exe就会方便许多。

我们可以使用Pyinstaller,主要原理是:

读取你的python脚本,分析其代码以发现脚本执行所需的其它模块和库(依赖项),然后将这些文件的一起放到特定的单个文件夹或可执行文件中,生成exe执行文件。

官方文档:Document


配置

安装命令:

pip install pywin32       # pyinstaller会需求pywin32的某些接口
pip install pyinstaller

若在安装pyinstaller的时候,可能会报错。我们可进入官网下载

img

下载文件后,解压,cmd命令窗口进入到对应目录下 ;输入命令:python setup.py install

如此,pyinstaller的环境算是配置好了。验证的话

# 在cmd中输入命令,检测下版本号
pyinstaller -v 

# 或者通过pip,检测下包是否安装
pip list

简单使用

新建文件夹test,并编写一个简单的python文件,内容如下:

print("Hello PythonInstaller")
# 添加此处为了避免exe打开一闪而过
input()                        

在test中打开cmd窗口,输入命令:

# -F 表示生成结果是exe文件 -D表示结果生成一个目录
pyinstaller -F test.py 

'''
注意:
针对于单一的python文件,推荐使用 -F 命令,
若python文件调用了相关的资源文件,建议在生成exe的目录下将资源文件拷贝到该目录下,否则会报错
'''

cmd会在test文件夹下生成build,dist文件目录:

  • build: 用于存放pyinstaller运行的中间文件,文件夹内的warn文件用于记录打包时遇到的一些问题,可作为参考

  • dist: 用于存放生成的exe文件

注意:针对于单一的python文件,推荐使用-F命令,若python文件调用了相关的资源文件,建议将资源文件拷贝生成的exe目录下,否则会报错。

比如,我有这样的在cmd窗口输入汉字生成拼图的工具,其目录为:

img

  • res: 放置了python拼图需要的.png或.jpg资源文件

  • HZK16 : 用于将汉字解析为矩阵的字库文件

  • tool.py : 执行脚本

在该目录下,打开cmd命令窗口,输入命令:

pyinstaller -F tool.py

命令会额外生成build,dist文件夹,此时我们需要将res,HZK16复制粘贴到dist目录下,然后点击tool.exe 才能执行成功。效果图为:

img

HZK16相关示例: 参考

复杂使用

一般情况下,我们将python打包exe会包含多个代码文件,资源等,故此我们需要了解下pyinstaller的命令。

参数描述命令
-h显示帮助pyinstaller -h
-v显示版本号pyinstaller -v
-F生成一个exe文件,所有的依赖,资源和代码都打包到exe中pyinstaller -F test.py
-D生成一个目录,包含所有的依赖,资源和exepyinstaller -D test.py
–log-level LEVELLEVEL有5个等级,分别为: TRACE, DEBUG, INFO, WARN, ERROR用于控制编译时pyi打印的消息-F --log-level ERROR
-n NAMENAME为生成.exe和.spec的文件名,默认:执行脚本的名称-F test.py -n NewTest
-p DIRDIR为额外的import路径,若有多个,用“;”隔开
–hidden-import NAMEpyi在分析的过程中,有些import没有分析出来,可使用此命令,且此命令可多次使用
–exclude-modeulepyi分析的相互关联的库,若某些库没用,可使用该命令,用于减少生成文件的大小
–key KEYKEY是用于加密python字节码的秘钥,一般为16的字符串
-d调试使用,用于生成exe时,输出pyi的一些日志,有助于查错
-c显示命令行窗口
-w隐藏命令化窗口,可用于GUI程序
-i NAMENAME为应用程序的icon图标,windows上使用.ico Mac上使用.icns图标的获取可参考:https://www.easyicon.net/pyinstaller -F test.py -i icon.ico
–version-file FILEFILE为应用程序添加的版本信息文件
-m FILEFILE为应用程序添加的manifest文件

为了更便捷的打包exe,我们可以通过自定义配置.spec文件来完成打包。

# 在脚本的目录下都会生成指定的test.spec文件
pyinstaller -F test.py 
pyinstaller -D test.py

# 我们也可以这样生成,此种生成不会产生build,dist文件夹
# 官网:https://pyinstaller.readthedocs.io/en/stable/spec-files.html
pyi-makespec test.py

该文件实质上是可执行的python文件,pyInstaller通过相关的配置来构建应用程序。当spec文件构建后,其大多数命令选项

都编码在文件中,因此若在命令行中使用已包含的命令,将会被忽略。尚且有效的命令行选项有:

--upx-dir=      --distpath=       --workpath=
--noconfirm     --ascii           --clean

文件的显示内容如下:

# -*- mode: python ; coding: utf-8 -*-
block_cipher = None

# 用于分析.py文件依赖的模块和库
a = Analysis(
    # scripts: 指定文件名的.py脚本列表,不同文件之间以","分割
    ['test.py'],
    # 在sys.path之间搜索的可选路径列表,一般已生成.spec的默认目录为准
    pathex=['C:\\Users\\wangxuhe\\Desktop\\test'],
    # 附加二进制文件(.dll等)的可选列表,命令:--add-binary
    binaries=[],
    # 要包含的附加数据文件的可选列表,命令:--add-data
    datas=[],
    # 要包含的附加隐藏模块的可选列表,命令:--hidden-import MODULENAME
    hiddenimports=[],
    # 用于搜索钩子的附加路径的可选列表,命令: --additional-hooks-dir HOOKSPATH
    hookspath=[],
    # 可选的脚本列表,用作用户的运行时挂钩。命令:--runtime-hook RUNTIME_HOOKS 
    runtime_hooks=[],
    # 一个可选的模块或包名列表(它们的Python名),该列表将被忽略。命令:--exclude-module EXCLUDES
    excludes=[],
    # 若为True,则不希望在搜索Windows SxS程序集时遵循版本重定向
    win_no_prefer_redirects=False,
    # 若为True,则将所有绑定的Windows SxS程序集更改为私有程序集以强制执行程序集版本
    win_private_assemblies=False,
    cipher=block_cipher,
    # 若为True,不要将源文件放在归档文件中,而是将它们作为单独的文件保存
    noarchive=False)

# 用于创建包含所有python模块的Zlib,包含程序运行需要的所有依赖文件
pyz = PYZ(
    a.pure, 
    # pyz的文件名
    a.zipped_data,
    # 用于加密python字节码的密码
    cipher=block_cipher)

# 用于构建最终的执行文件,由Analysis和PYZ生成
exe = EXE(
    pyz,
    a.scripts,
    [],
    # 若为True,将exe构建转发给pkg
    exclude_binaries=True,
    # 可执行文件.exe的文件名
    name='test',
    # exe的图标资源
    icon='icon.ico',
    # 若为True,则可从执行文件获取调试信息
    debug=False,
    # window默认False,非windows使用,用于引导程序忽略可忽略的信息
    bootloader_ignore_signals=False,
    strip=False,
    upx=True,
    # 若为true,则显示控制台
    console=True)

# 用于生成非执行文件外的文件夹,在单文件模式下不会调用,且该接口也可以没有故此不再描述 
coll = COLLECT(
    exe,
    a.binaries,
    a.zipfiles,
    a.datas,
    strip=False,
    upx=True,
    upx_exclude=[],
    name='test')

未完待续…

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

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

相关文章

Python基础-环境安装

Python安装1.下载PythonPython网址:https://www.python.org/进入Python官网,点击Downloads,选择自己对应的操作系统(此处以Windows为例)在左侧的稳定发行版中,选择一个3.5版本以上的,然后点击对…

2003-Can‘t connect to MySQL server on ‘192.168.232.128(10060 “Unknown error“)

MySQL远程连接报错2003-cant connection to mysql server on ‘IP’(10061 unknown error)的解决 **首先去看有没有关闭防火墙!!!** 停止firewall服务 systemctl stop firewalld.service 禁止firewall开机启动 syste…

C++的完美讲解,还不快来看看?

目录 简介: 创建C程序: Windows编译简介: Hello,C World! 简介: C融合了3中不同的编程传统:C语言代表的过程性传统、C在C语言基础上添加的类代表的面向对象语言的传统以及C模板支持的通用编程传统。一般来说,计算机语言…

揭开JavaWeb中Cookie与Session的神秘面纱

文章目录1,会话跟踪技术的概述2,Cookie2.1 Cookie的基本使用2.2 Cookie的原理分析2.3 Cookie的使用细节2.3.1 Cookie的存活时间2.3.2 Cookie存储中文3,Session3.1 Session的基本使用3.2 Session的原理分析3.3 Session的使用细节3.3.1 Session…

数据结构与算法系列之kmp算法

什么是kmp算法 1.kmp算法是一种改进的字符串算法,其核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数已达到快速匹配的目的。 它主要实现作用的是 在 (主串)中找到 (匹配)字符串。 例 BF算法与k…

接口服务限流方案

一.限流方式1.中间件支持限流2.限流配置单台服务最大qps,通过令牌桶算法进行限流3.支持url前缀匹配二.配置1.文件配置qps 1000 //单台服务最大qpsrule "/ucenter" //限流识别前缀,如不配置为全局限流downgradeHttpStatus 200//降级方案返回…

PointNet++的源码运行

首先,从github上下载源码https://github.com/yanx27/Pointnet_Pointnet2_pytorch也可以从百度网盘下载链接:https://pan.baidu.com/s/1sgTYuqnBVC9p3bib450SOQ 提取码:gujd再下载对应的测试数据分类数据modelnet40_normal_resampled下载&…

UnRaid虚拟机安装OpenWrt软路由

文章目录0、前言1、Openwrt虚拟机安装1.1、前提,需要先在UnRaid中开启虚拟机:1.2、下载OpenWrt虚拟机镜像并上传至UnRaid共享文件夹1.3、创建OpenWrt虚拟机2、开启并设置OpenWrt虚拟机2.1、修改OpenWrt管理ip2.2、OpenWrt的上网设置0、前言 最近折腾了很…

扁桃体肥大对儿童有什么影响?怎么办及怎样才能消下去?

很多人不知道扁桃体肥大对孩子有什么影响。今天,李松培医生将向大家讲解这方面的知识。同时,他还将告诉大家如何消除扁桃体肥大扁桃体肥大对儿童有什么影响:事实上,说实话,扁桃体肥大对儿童的影响很大,因为…

最全Linux驱动开发全流程详细解析(持续更新)

Linux驱动开发详细解析 一、驱动概念 驱动与底层硬件直接打交道,充当了硬件与应用软件中间的桥梁。 具体任务 读写设备寄存器(实现控制的方式)完成设备的轮询、中断处理、DMA通信(CPU与外设通信的方式)进行物理内存…

Python爬虫(8)selenium爬虫后数据,存入sqlit3实现增删改查

之前的文章有关于更多操作方式详细解答,本篇基于前面的知识点进行操作,如果不了解可以先看之前的文章 Python爬虫(8)selenium爬虫后数据,存入sqlit3实现增删改查导入默认包和环境元素定位创建一个sqlit3表将爬虫到的信…

知识蒸馏综述笔记

知识蒸馏的目的 将学习能力强的复杂教师模型中的“知识”迁移到简单的学生模型中 1.知识蒸馏的背景知识 2.解释知识蒸馏的作用机制 3.归纳知识蒸馏中知识的不同形式 4.详细分析和对比了知识蒸馏的各种关键方法, 5.介绍知识蒸馏与其它技术融合、 6.对知识蒸馏…

VirtualBox 安装 CentOS 换成 Rocky Linux

1.下载 VirtualBox并安装https://www.virtualbox.org/wiki/Downloads2.下载Rocky Linux选择 Rocky-9.1-x86_64-dvd.iso 镜像 官网https://rockylinux.org/download阿里云镜像服务https://mirrors.aliyun.com/rockylinux/9.1/isos/x86_64/?spma2c6h.25603864.0.0.70c556799nMQL…

设计模式看 Spring。

设计模式看 Spring。 文章目录设计模式看 Spring。自定义 Spring 框架。7.1 Spring 使用回顾。7.2 Spring 核心功能结构。7.1.1 bean 概述。7.3 Spring IoC 相关接口分析。7.3.1 BeanFactory 解析。7.3.2 BeanDefinition 解析。7.3.3 BeanDefinitionReader 解析。7.3.4 BeanDef…

论文阅读 | Video Frame Synthesis using Deep Voxel Flow

前言: 视频帧生成方法(视频插帧/视频预测)ICCV2017 oral Video Frame Synthesis using Deep Voxel Flow 引言 当下进行视频帧合成的方法分为两种,第一种是光流法,光流准确的话效果好,光流不准确的话则生…

手摸手,带你实现3D粒子特效

文章摘要:某天,产品小姐姐找到我,要在页面上放一个动态3D模型…不会webGL?没关系!今天就来聊一聊如何用从零实现3D粒子特效。 背景 近年来,随着互联网的迅速发展,用户对产品的视觉效果需求也更…

内网渗透(四十六)之横向移动篇-使用系统漏洞ms17010横向移动

系列文章第一章节之基础知识篇 内网渗透(一)之基础知识-内网渗透介绍和概述 内网渗透(二)之基础知识-工作组介绍 内网渗透(三)之基础知识-域环境的介绍和优点 内网渗透(四)之基础知识-搭建域环境 内网渗透(五)之基础知识-Active Directory活动目录介绍和使用 内网渗透(六)之基…

leaflet 加载geojson数据,随机显示不同颜色的circleMarker

第086个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+leaflet项目中加载geojson数据,随机显示不同颜色的circleMarker. 直接复制下面的 vue+leaflet源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方式示例源代码(共89行)相关API专栏目标示例效果 配置方式…

时间序列数据预测的类型

本文主要内容是使用LSTM网络进行不同类型的时间序列预测任务,不涉及代码,仅仅就不同类型的预测任务和数据划分进行说明。 参考文章:https://machinelearningmastery.com/how-to-develop-lstm-models-for-time-series-forecasting/ 注&#xf…

如何使用Hugo Academic Theme构建自己的github主页

前期条件 自己已经注册好GitHub 原文档:https://wowchemy.com/docs/getting-started/hugo-github-quickstart/ 搜索Hugo Academic Theme(网址) 进入后的网址为:https://academic-demo.netlify.app/ 点击Get Start 出现如下模板…