pyinstaller教程(二)-快速使用(打包python程序为exe)

news2024/9/20 20:32:25

1.介绍

PyInstaller 是一个强大的 Python 打包工具,可以将 Python 程序打包成独立的可执行文件。以下会基于如何在win系统上将python程序打包为exe可执行程序为例,介绍安装方式、快速使用、注意事项以及特别用法。

2.安装方式

通过 pip 安装
PyInstaller 可以通过 pip 命令在线安装。这是最简单和推荐的安装方式。

pip install pyinstaller

这种方法适用于所有操作系统

3.快速开始

3.1 基本用法

打包一个 无任何调用及依赖的Python脚本 非常简单,只需指定作为程序入口的脚本文件即可。

pyinstaller myscript.py

这个命令执行会生成下图文件

  • 当前目录下写入 myscript.spec(与脚本名相同)
  • 在当前目录创建 build目录,并写入一些日志文件和工作文件。
  • dist如果不存在则在当前目录中创建。
  • 将可执行文件夹写入文件夹 myscriptdist,dist包含一个目录 _internal和一个文件 myscript.exe_internal目录中包含脚本所有的额外依赖包括python解释器、dll动态库等。

pyinstaller目录结构

dist/myscript

如何想打包成一个exe文件的,可指定参数 -F或者--onefile,例如,

   pyinstaller -F myscript.py 

其中 -F 参数表示生成单个可执行文件。
dist/myscript

参数(仅解释部分个人认为还算常用的参数)

参数参数描述
-F, –onefile打包一个单个文件,如果你的代码都写在一个.py文件的话,可以用这个,如果是多个.py文件就别用
-D, –onedir打包多个文件,在dist中生成很多依赖文件,适合以框架形式编写工具代码,我个人比较推荐这样,代码易于维护
-w,–windowed,–noconsole使用Windows子系统执行.当程序启动的时候不会打开命令行(只对Windows有效)
-c,–nowindowed,–console在部署时包含 TCL/TK
–icon=<FILE.ICO>file.ico添加为可执行文件的资源**(只对Windows系统有效),改变程序的图标 pyinstaller -**i ico路径 xxxxx.py
–icon=<FILE.EXE,N>file.exe的第n个图标添加为可执行文件的资源**(只对Windows系统有效)**
-n NAME, –name=NAME可选的项目**(产生的spec)名字.如果省略,第一个脚本的主文件名将作为spec**的名字

3.2 高阶用法

既然是高阶用法,那便需要更深层次的理解,并能解决一些困难问题,例如多脚本调用、复杂依赖等问题。本章节首先从spec文件讲起,基于 spec文件会讲解如何通过修改spec文件以达到一些目的。

3.2.1 spec介绍

上一节提到在执行 pyinstaller myscript.py后会生成 myscript.spec文件,该文件实际上是决定整个打包过程的配置文件,因此对于pyinstaller的高阶用法将针对spec文件展开。

首先认识一下该文件的内容:

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

# 第一步:分析入口脚本,分析所有导入以及依赖。
# 分析完后a会产生4个变量:
#     a.pure 依赖的纯 python 文件->("module", "D:\\XXX\XXX\module.py", "PYMODULE")
#     a.scripts 依次执行的脚本文件->('hook', 'D:\\XXX\\hook.py', 'PYSOURCE')
#     a.binaries 依赖的二进制文件->('python38.dll', 'D:\\XXX\\python38.dll', 'BINARY')
#     a.datas 依赖的非二进制文件->('input.txt', 'D:\\XXX\\input.txt', 'DATA'
a = Analysis(
    ['myscript.py'],	# 入口python脚本,即待分析的脚本入口
    pathex=[],		# 模块搜索的路径,默认当前环境变量
    binaries=[],	# 脚本所需的非python模块,例如DLL动态库,[ ( '/usr/lib/libiodbc.2.dylib', '.' ) ]
    datas=[],		# 脚本所需的非二进制文件,[ ( 'src/README.txt', '.' ), ( '/mygame/sfx/*.mp3', 'sfx' )]
    hiddenimports=[],	# 预先指定PyInstaller 无法自动检测到的模块
    hookspath=[],
    hooksconfig={},
    runtime_hooks=[],
    excludes=[],	# 预先需要排除的模块,即不希望打包进来的模块
    noarchive=False,
    optimize=0,
)

# 创建包含python的主程序以及依赖项,该部分代码会被打包进exe文件,在exe运行时会解压到临时文件然后被调用。
pyz = PYZ(a.pure)

# 创建exe文件
exe = EXE(
    pyz,				# 包含了纯python代码
    a.scripts,				# 包含了data以及依赖项
    [],					# 包含需要打包到 exe 文件内的二进制文件
    exclude_binaries=True,		# 默认为True,所有的二进制文件将被排除在exe之外
    name='myscript',			# exe文件命名
    debug=False,			# 打包过程是否打印调试信息
    bootloader_ignore_signals=False,
    strip=False,
    upx=True,
    console=True,			# 默认为True,在控制台窗口中运行,否则作为后台进程运行
    disable_windowed_traceback=False,
    argv_emulation=False,
    target_arch=None,
    codesign_identity=None,
    entitlements_file=None,
)
# 组织收集exe的依赖
coll = COLLECT(
    exe,
    a.binaries,
    a.datas,
    strip=False,
    upx=True,
    upx_exclude=[],
    name='myscript', # dist目录下的目录名称
)

然后已经存在该spec文件后,可以通过执行如下命令进行打包。

pyinstaller myscript.spec

3.2.2 适用场景

(1)打包的依赖库缺少文件、存在额外的数据要拷贝
# -*- mode: python ; coding: utf-8 -*-

########################>>重点在这里<<#####################################
# 加入 打包过程中遇到numpy的依赖问题
import os
from importlib.util import find_spec
# 空列表,用于准备要复制的数据
datas = []
# 存在依赖问题的模块
manual_modules = ['numpy', 'librosa']
for m in manual_modules:
    if not find_spec(m): 
	raise Except(f"{m}模块未找到!")
    datas.append((os.path.dirname(find_spec(m).origin, m))  	# 以 (src, dst) 元组的形式添加到 datas 列表

# 额外复制的文件
my_files = ['/data/input.txt', ]
for file in my_files:
    datas.append((file, '.'))		# 将文件复制到打包目标路径的根目录
###########################################################################
a = Analysis(
    ['myscript.py'],	# 入口python脚本,即待分析的脚本入口
    pathex=[],		# 模块搜索的路径,默认当前环境变量
    binaries=[],	# 脚本所需的非python模块,例如DLL动态库,[ ( '/usr/lib/libiodbc.2.dylib', '.' ) ]
    datas=datas,	# 脚本所需的非二进制文件,[ ( 'src/README.txt', '.' ), ( '/mygame/sfx/*.mp3', 'sfx' )]
    hiddenimports=[],	# 预先指定PyInstaller 无法自动检测到的模块
    hookspath=[],
    hooksconfig={},
    runtime_hooks=[],
    excludes=[],	# 预先需要排除的模块,即不希望打包进来的模块
    noarchive=False,
    optimize=0,
)

......
(2)暴露打包后可能会修改的python脚本

可以利用a.datas的特点,将一些纯python脚本在打包时排除在exe之外,例如将核心代码 myscript.myscripyt_core.py排除在exe外,以便后期修改代码。

其原理是将保存在 a.pure中的纯python代码替换到 a.datas中。

......
a = Analysis(
    ['myscript.py'],	# 入口python脚本,即待分析的脚本入口
    pathex=[],		# 模块搜索的路径,默认当前环境变量
    binaries=[],	# 脚本所需的非python模块,例如DLL动态库,[ ( '/usr/lib/libiodbc.2.dylib', '.' ) ]
    datas=[],		# 脚本所需的非二进制文件,[ ( 'src/README.txt', '.' ), ( '/mygame/sfx/*.mp3', 'sfx' )]
    hiddenimports=[],	# 预先指定PyInstaller 无法自动检测到的模块
    hookspath=[],
    hooksconfig={},
    runtime_hooks=[],
    excludes=[],	# 预先需要排除的模块,即不希望打包进来的模块
    noarchive=False,
    optimize=0,
)
######################>>重点在这里<<###########################
# 需要暴露在外的python(不带 .py)
my_modules = ['myscript.myscript_core"]
# 将被排除的模块添加到 a.datas,同时将module排除在pure_list
pure_list = []
for mod in a.pure:
   if mod[0] in my_modules:
	mod[-1] = "DATA"
	a.datas.append(mod)
   else:
	pure_list.append(mod)
a.pure = pure_list
##############################################################

# 创建包含python的主程序以及依赖项,该部分代码会被打包进exe文件,在exe运行时会解压到临时文件然后被调用。
pyz = PYZ(a.pure)

......

4. 注意事项

在打包复杂的python工程或者项目时请注意:

  1. 务必指定入口脚本(不可使用-m 模块方式执行)。
  2. python脚本中尽量避免使用from XXX import *。
  3. 避免使用importlib来动态导入模块,避免使用。

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

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

相关文章

随笔-不是来养老的吗

来了有一个多月了&#xff0c;日子过得飞快。都以为我来养老的&#xff0c;一开始我也这么认为&#xff0c;结果6月份的日均工时&#xff0c;排在了部门第一。一个月做的需求比之前的三个月都多。 来之前&#xff0c;老徐让我多承担点&#xff0c;想着能有多少活嘛&#xff0c…

QT TCP多线程网络通信

学习目标&#xff1a; TCP网络通信编程 学习前置环境 运行环境:qt creator 4.12 QT TCP网络通信编程-CSDN博客 Qt 线程 QThread类详解-CSDN博客 学习内容 使用多线程技术实现服务端计数器 核心代码 客户端 客户端&#xff1a;负责连接服务端&#xff0c;每次连接次数1。…

sklearn之神经网络学习算法

文章目录 什么是神经网络人工神经网络的结构输入层输出层隐含层神经元的链接 近几年深度学习还是比较火的&#xff0c;尤其是在大语言模型之后&#xff0c;在本质上深度学习网络就是层数比较多的神经网络。sklearn并不支持深度学习&#xff0c;但是支持多层感知机&#xff08;浅…

安全测试理论

安全测试理论 什么是安全测试&#xff1f; 安全测试&#xff1a;发现系统安全隐患的过程安全测试与传统测试区别 传统测试&#xff1a;发现bug为目的 安全测试&#xff1a;发现系统安全隐患什么是渗透测试 渗透测试&#xff1a;已成功入侵系统为目标的的攻击过程渗透测试与安全…

自动驾驶事故频发,安全痛点在哪里?

大数据产业创新服务媒体 ——聚焦数据 改变商业 近日&#xff0c;武汉城市留言板上出现了多条关于萝卜快跑的投诉&#xff0c;多名市民反映萝卜快跑出现无故停在马路中间、高架上占最左道低速行驶、转弯卡着不动等情况&#xff0c;导致早晚高峰时段出现拥堵。萝卜快跑是百度 A…

配置与管理Samba服务器(详细教程)

目录 一、基础理论 二、samba工作流程 三、项目实训 3.1目的 3.2准备工作 3.2.1服务器安装samba服务软件包 3.2.2客户端安装软件包 3.3配置Samba服务 3.3.1开启Samba服务&#xff0c;并设置开启自启动 3.3.2创建共享文件夹 3.3.3创建群组 3.3.4修改文件用户权限 3.3.5修改…

LabVIEW人工模拟肺控制系统开发

开发了一种创新的主被动一体式人工模拟肺模型&#xff0c;通过LabVIEW开发的上位机软件&#xff0c;实现了步进电机驱动系统的精确控制和多种呼吸模式的模拟。该系统不仅能够在主动呼吸模式下精确模拟快速呼吸、平静呼吸和深度呼吸&#xff0c;还能在被动模式下通过PID控制实现…

训练CDN基础代码

文章目录 时间整体流程训练细节小结 时间 从开始在平台上搭建到现在可以在平台上训练已经4天了 有GPU平台一般是autoDL平台&#xff0c;白嫖200元平台是&#xff1a;https://cloud.lanyun.net/ 整体流程 1.注册平台&#xff0c;以蓝耘为例子 卡从好变坏依次是&#xff1a;…

C语言:指针详解(5)

目录 一、sizeof()函数和strlen()函数的对比 1.sizeof()函数 2.strlen()函数 3.sizeof()函数和strlen()函数的对比 二、数组和指针笔试试题解析 1.一维数组 2.字符数组 &#xff08;1&#xff09;代码1 &#xff08;2&#xff09;代码2 &#xff08;3&#xff09;代码…

【数组、特殊矩阵的压缩存储】

目录 一、数组1.1、一维数组1.1.1 、一维数组的定义方式1.1.2、一维数组的数组名 1.2、二维数组1.2.1、二维数组的定义方式1.2.2、二维数组的数组名 二、对称矩阵的压缩存储三、三角矩阵的压缩存储四、三对角矩阵的压缩存储五、稀疏矩阵的压缩存储 一、数组 概述&#xff1a;数…

香橙派AIpro:体验强劲算力,运行ROS系统

文章目录 前言一、香橙派AIpro开箱及功能介绍1.1香橙派AIpro开箱1.2香橙派AIpro功能介绍 二、香橙派AIpro资料下载及环境搭建2.1资料下载2.2环境搭建2.3使用串口启动进入开发板2.4使用HDMI线接入屏幕启动 三、部署ROS系统四、香橙派AIpro的使用和体验感受 前言 本篇文章将带体…

sip协议栈简介

SIP协议栈简介 SIP协议栈流程 数据链路层&#xff1a;当SIP消息从网络中传输到达TCP/IP协议栈时&#xff0c;首先被接收到的是数据链路层的数据帧。数据链路层会对数据帧进行解封装&#xff0c;得到网络层的IP数据报。 网络层&#xff1a;网络层会对IP数据报进行解析&#xf…

js实现 JSON数据格式化的两种方法

本次方法不使用JS库直接采用原生JS 完整HTML代码如下&#xff0c;您可以复制代码然后&#xff0c;新建一个.html的网页进行保存即可体验 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title></head><b…

Xcode 16 beta3 真机调试找不到 Apple Watch 的尝试解决

很多小伙伴们想用 Xcode 在 Apple Watch 真机上调试运行 App 时却发现&#xff1a;在 Xcode 设备管理器中压根找不到对应的 Apple Watch 设备。 大家是否已将 Apple Watch 和 Mac 都重启一万多遍了&#xff0c;还是束手无策。 Apple Watch not showing in XCodeApple Watch wo…

android13 文件管理器无法安装apk 奔溃问题

总纲 android13 rom 开发总纲说明 目录 1.前言 2.我们简单写个apk测试下 3.排查客户apk 4.frameworks源码排查 5.编译验证 6.彩蛋 1.前言 客户提供的文件管理apk不能安装apk文件,一点击就奔溃。 2.我们简单写个apk测试下 private void installApk(File apkFile) {i…

从0开始学习informer

目录 informer特点informer原理attention计算KL散度 backbone网络部分encoder输入输出部分embadding这里就不讲了 和transfomer一样EncoderStack decoder部分接下来就是最关键的结构 关于如何将输入经过注意力得到结果 结束&#xff0c;代码会放到下一篇讲 这里是原理 informer…

[Vulnhub] Sedna BuilderEngine-CMS+Kernel权限提升

信息收集 IP AddressOpening Ports192.168.8.104TCP:22, 53, 80, 110, 111, 139, 143, 445, 993, 995, 8080, 55679 $ nmap -p- 192.168.8.104 --min-rate 1000 -sC -sV PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 6.6.1p1 Ubuntu 2ubuntu2 …

PTX入门教程与实战

PTX入门教程 官方文档的目录结构 1 PTX指令 官方文档链接 1.1 指令形式 指令的操作数个数从0-4不等&#xff0c;其中d代表的是目的操作数&#xff0c;a,b,c是源操作数 p opcode;p opcode a;p opcode d, a;p opcode d, a, b;p opcode d, a, b, c;2 编程模型 2.…

人工智能算法工程师(中级)课程9-PyTorch神经网络之全连接神经网络实战与代码详解

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下人工智能算法工程师(中级)课程9-PyTorch神经网络之全连接神经网络实战与代码详解。本文将给大家展示全连接神经网络与代码详解&#xff0c;包括全连接模型的设计、数学原理介绍&#xff0c;并从手写数字识别到猫狗识…

JVM监控及诊断工具-命令行篇-jstat命令介绍

JVM监控及诊断工具-命令行篇01-jstat&#xff1a;查看JVM统计信息 一 基本情况二 基本语法2.1 option参数1. 类装载相关的&#xff1a;2. 垃圾回收相关的-gc&#xff1a;显示与GC相关的堆信息。包括Eden区、两个Survivor区、老年代、永久代等的容量、已用空间、GC时间合计等信息…