当前位置:首页 » 《关注互联网》 » 正文

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

10 人参与  2024年10月04日 19:20  分类 : 《关注互联网》  评论

点击全文阅读


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

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

运行可执行文件

进入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 sysfrom PyInstaller.utils import collect_data_files # 定义spec文件配置block_cipher = Nonea = 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 syssys.path.append('d:/python_env/spider2_env/lib/site-packages') import tkinter as tkfrom tkinter import messagebox,ttkfrom PIL import ImageTk, Imageimport osimport 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,)


点击全文阅读


本文链接:http://zhangshiyu.com/post/167797.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1