【python】之pyinstaller模块,python程序打包成一个可执行exe 文件(超详细)!

在开发Python应用程序时,将代码打包成可执行文件(.exe)是一个常见的需求。主要是方便接收者的使用,在没有python环境下也能正常打开的可执行文件。

Pylnstaller是一个在Windows、GNU/Linux、macos等平台下将Python程序冻结(打包)为独立可执行文件的工具,用于在未安装Python的平台上执行Python编写的应用程序

相比类似工具,它的主要优点是Pylnstaller与Python3.7-3.10一起工作,由于透明压缩,它构建了更小的可执行文件,它是完全多平台的,并使用操作系统支持加载动态库,从而确保完全兼容
PyInstaller会分析Python程序,并将程序打包成一个完整的可执行文件,包括所有依赖项。此外,Pylnstaller可以自动检测Python依赖库,并将其打包到可执行文件中
Pylnstaller的原理是将Python程序转换为C语言代码,并将C语言代码编译成可执行文件。具体来说,Pylnstaller会将Python程序分析为一个抽象语法树(AST),然后将AST转换为C语言代码。

1.更新pip指定版本、指定镜像源

python.exe -m pip install --upgrade pip==24.2 -i https://pypi.tuna.tsinghua.edu.cn/simple

python.exe -m pip install --upgrade pip==24.2 -i https://pypi.tuna.tsinghua.edu.cn/simple

国内镜像源:

备注:pip install时出现WARNING: Ignoring invalid distribution

2.windows安装Pylnstaller库

在开始之前,我们需要安装打包的工具,我们将使用“pyinstaller”来打包Python文件成可执行文

win+r,输入cmd  进入命令行终端

#安装命令
pip install pyinstaller
#安装太慢的话,可切换源
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pyinstaller   #从清华源安装

等待安装完成即可!

2.1.pyinstaller 执行文件位置

D:\Program Files\pyhton3.11.4\Scripts

2.2环境变量配置

path 里添加 script路径\

2.3测试能否使用

3.pyinstaller 常用打包参数

pyinstaller --help #查看支持哪些参数

常用的参数:有的看可能看到用的是非错写版参数,也是正常的。

4.打包命令

 windows和linux使用的命令都是一样的,这里为了方便平时使用,直接复制 粘贴使用,就分开写了。

windows系统打包命令:

# 如果你的Python程序是一个GUI应用程序,可以使用如下命令将其打包为GUI应用程序:
# 其中,--windowed参数表示生成无控制台窗口应用程序,--icon参数表示定义程序图标。
# -F  生成单个可执行文件, -w 不显示doc 小黑框
Pyinstaller -F  -w 你的脚本.py  -i   你的图标.ico (pyinstaller 首字母大小写都可以)

linux系统打包命令:

pyinstaller 你的脚本.py 
# 默认情况下,PyInstaller生成的可执行文件包含多个文件。
# 如果需要将所有文件打包成一个单独的可执行文件,可以使用如下命令:
# --onefile 和 -F 是一样的
pyinstaller --onefile 你的脚本.py  
pyinstaller -F 你的脚本.py 
#如果你的Python程序是一个控制台应用程序,可以使用如下命令将其打包为控制台应用程序
pyinstaller --console 你的脚本.py # -c  --console

设置环境变量 
如果你的Python程序需要使用环境变量,可以通过设置PyInstaller的环境变量来实现。例如,如果你的Python程序需要使用MY_VAR环境变量,可以使用如下命令: 
 pyinstaller --env MY_VAR=value yourscript.py 
 

准备python文件

在打包之前,确保你的python文件可以独立运行,并不依赖于动态加载的模块或其他外部源。如果你的文件有依赖项,确保他们已经正确的安装并能够在打包后被访问。

打包python文件

打开命令终端,并控制前往到你包含python文件(key_logger.py)的目录(也可以打开文件所在地,cmd)

单个python程序的转换

Pyinstaller -F -w xxxx.py

切换到要转换的python文件路径,输入上述指令。

(1)-F: 只生成一个单个文件(只有一个 exe 文件)

(2)-w: 就是exe运行的时候不弹出那个命令行(黑窗口)

(3)xxx.py: 就是需要转换的python文件

接收到以下信息,即代表成功

执行打包命令回车运行

 1.这将使用pyinstaller库将python文件打包成一个独立的可执行文件。

 2. 打包过程需要些时间,等待完成。

打包完成,会在当前目录看到一个dist的文件夹

3.如果需要转换的python程序用到的外部库太多,程序比较大的情况下,可能会出现如下错误信息:

解决方法如下:

在执行完成后虽然报错,但是与xxx.py文件同级目录下会生成一个xxx.spec文件,打开这个文件,xxx.py第一行是字符编码,在代码的第二三行加入下面两句代码。

然后执行下面代码(千万不要再去执行原来的打包命令)

pyinstaller -F -w xxxx.py

完成后双击运行该文件就可以啦。

运行可执行文件

  1. 进入dist 文件夹,找到生成的可执行文件,名字为key_logger.exe
  2. 将可执行文件复制到你想要运行它的计算机上。
  3. 双击可执行文件,你的python程序将开始执行。

注意事项:

设置环境变量 
如果你的Python程序需要使用环境变量,可以通过设置PyInstaller的环境变量来实现。例如,如果你的Python程序需要使用MY_VAR环境变量,可以使用如下命令: 
 pyinstaller --env MY_VAR=value yourscript.py 

关于依赖项和资源(第三方库或者模块,使用到的图片,配置文件)依赖项管理:如果你的Python程序依赖于外部库或模块,你需要确保这些依赖项在打包后可以正确访问。可以通过在打包命令中使用--hidden-import参数来指定需要包含的额外模块。

数据文件和资源:如果你的程序需要访问数据文件或其他资源文件,例如配置文件、图像等,确保这些文件与可执行文件一起打包。你可以使用--add-data参数来指定包含这些文件,如:

pyinstaller --onefile --add-data "data_files;data_files" your_script.py

打包多个文件

如果你的应用程序由多个Python文件组成,你可以通过将所有文件作为参数传递给pyinstaller命令来打包它们

pyinstaller --onefile file1.py file2.py

这将打包所有指定的文件,并生成一个单独的可执行文件

实际打包会出现各种问题! 

成功打包成可执行文件的时候。一打开这个文件,发现成了“不可执行文件”,路径错误问题,第三方库没有打包过去,环境也没有一起打包过去......

那怎么办啊,语法又记不住,那就用spec文件。

spec文件

spec文件是PyInstaller工具生成的一个配置文件,用于定义和配置打包过程中的各种选项和参数。它是一个纯文本文件,通常与要打包的Python脚本文件位于同一目录中,并以.spec作为文件扩展名。

spec文件包含了一些重要的信息,例如要打包的脚本文件、依赖项、数据文件、资源文件等。通过编辑spec文件,你可以自定义打包过程的行为和结果,以满足特定的需求。

创建spec文件

使用PyInstaller进行打包时,可以通过两种方式生成spec文件:

1.自动创建

在命令行终端中执行以下命令,PyInstaller将自动为指定的Python脚本文件生成一个默认的spec文件:

pyinstaller your_script.py

2.手动创建

也可以手动创建一个spec文件,并在其中指定需要打包的文件、依赖项和其他选项。创建一个新的文本文件,并使用以下基本结构

# your_script.spec
 
# 导入所需的模块
import sys
from PyInstaller.utils import collect_data_files
 
# 定义spec文件配置
block_cipher = None
a = Analysis(['your_script.py'],  # 替换成你要打包的Python脚本文件
             pathex=[],
             binaries=[],
             datas=collect_data_files('your_package'),  # 替换成你要包含的数据文件路径
             hiddenimports=[],
             hookspath=[],
             runtime_hooks=[],
             excludes=[],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher,
             noarchive=False)
pyz = PYZ(a.pure, a.zipped_data,
             cipher=block_cipher)
exe = EXE(pyz,
          a.scripts,
          a.binaries,
          a.zipfiles,
          a.datas,
          [],
          name='your_script',  # 替换成你的可执行文件名
          debug=False,
          bootloader_ignore_signals=False,
          strip=False,
          upx=True,
          upx_exclude=[],
          runtime_tmpdir=None,
          console=True)

修改spec文件内容 
使用文本编辑器打开.spec文件(your_script_name.spec),并根据需要进行修改。你可以自定义输出文件的名称、要包含的附加文件等选项。

1.添加第三方库:在.spec文件中,使用--add-data选项添加第三方库的文件。

如果第三方库包含非二进制文件(例如Python脚本、配置文件),可以使用--add-data选项来指定库文件相对于脚本文件的路径
 

datas=[('path/to/library/files/*', 'library/files')]

如果第三方库包含二进制文件(例如DLL文件、共享库),可以使用--add-binary选项来包含这些文件。指定库文件相对于脚本文件的路径。

binaries=[('path/to/library/binary', '.')]

2. 添加图片路径:在.spec文件中,可以使用--add-data选项添加图片路径,以确保图片文件被正确地打包进可执行文件。

datas=[('path/to/image/file.jpg', '.')]

path/to/image/file.jpg替换为实际的图片路径,并根据需要调整目标文件夹。

 打包文件

编辑好了spec文件,你可以使用以下命令来执行打包过程:

pyinstaller your_script.spec

然后就会根据spec文件中的配置来进行打包文件,生成可执行文件 。

这是我打包一个按钮小程序时用到的spec文件:

# -*- mode: python ; coding: utf-8 -*-
 
 
block_cipher = None
 
import sys
sys.path.append('d:/python_env/spider2_env/lib/site-packages')
 
import tkinter as tk
from tkinter import messagebox,ttk
from PIL import ImageTk, Image
import os
import random
 
 
 
 
 
a = Analysis(
    ['anniu.py'],
    pathex=['D:/exe/py1'],
    binaries=[],
    datas=[('D:\\exe\\py1\\imgs\\a.jpg', 'imgs'), ('D:\\exe\\py1\\imgs\\c.jpg', 'imgs')],
    hiddenimports=['PIL', 'tkinter', 'random', 'PIL.ImageTk'],
    hookspath=[],
    hooksconfig={},
    runtime_hooks=[],
    excludes=[],
    win_no_prefer_redirects=False,
    win_private_assemblies=False,
    cipher=block_cipher,
    noarchive=False,
)
pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher)
 
exe = EXE(
    pyz,
    a.scripts,
    a.binaries,
    a.zipfiles,
    a.datas,
    [],
    name='anniu',
    debug=False,
    bootloader_ignore_signals=False,
    strip=False,
    upx=True,
    upx_exclude=[],
    runtime_tmpdir=None,
    console=True,
    disable_windowed_traceback=False,
    argv_emulation=False,
    target_arch=None,
    codesign_identity=None,
    entitlements_file=None,
)

  • 18
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值