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

lina_999 2024-08-22 17:35:02 阅读 86

在开发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

<code>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  进入命令行终端

<code>#安装命令

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系统打包命令:

<code># 如果你的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程序的转换

<code>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第一行是字符编码,在代码的第二三行加入下面两句代码。

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

<code>pyinstaller -F -w xxxx.py

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

运行可执行文件

进入dist 文件夹,找到生成的可执行文件,名字为key_logger.exe将可执行文件复制到你想要运行它的计算机上。双击可执行文件,你的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', # 替换成你的可执行文件code>

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',code>

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,

)



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。