原理:pyinstaller 会将python解释器、脚本、及对应的库,打包成一个可执行的exe文件,免去了重新安装python解释器及对应的库的操作,使用户操作方便
下面展示一个demo的案例,项目的目录如下
主要的打包命令是:
pyinstaller -F --key naura demo.py --add-data ".\\sense;.\\sense" --add-data ".\\alg;.\\alg" -w --noconfirm
参数说明:
-F 是打包生成一个文件
--key 是打包机密
--add-data 要把脚本中依赖的目录给加进去, ".\\sense;.\\sense" 的格式是生成对应的配置文件是需要元组的格式,分别对应目前的目录和打包后对应数据的目录名字有点像容器中的数据卷的映射的意思,打包后生成的.spec文件会有对应的数据如下:
每个模块的代码如下
alg模块下是一个可执行程序和一个__init__.py
import os
import subprocess as sp
file_path = os.path.dirname(__file__)
print(file_path)
def start_tj():
# cmd_str = 'tj.exe'
cmd_str = 'tj_v2.1.7.exe'
print(f'path: {file_path}, cmd_str: {cmd_str}')
res = sp.Popen(cmd_str, shell=True, cwd=file_path)
res.wait()
print('code:', res.returncode)
sense 目录下同理
import os
import subprocess as sp
file_path = os.path.dirname(__file__)
def start_sense():
cmd_str = 'sense_shield_installer_pub_2.5.0.58439.exe /S /not_create_desktop_shortcuts /senseshield_hide_taskbar_icon'
print(f'path: {file_path}, cmd_str: {cmd_str}')
res = sp.Popen(cmd_str, shell=True, cwd=file_path)
res.wait()
print('code:', res.returncode)
demo.py 如下:
# -*- coding:utf-8 -*-
"""
CreateBy: dai.chao
Date: 2023/01/16
"""
import psutil
from sense import start_sense
from alg import start_tj
# 判断是否已经安装了用户工具
def is_exist_user_tool():
pids = psutil.pids()
for pid in pids:
p = psutil.Process(pid)
name = p.name()
if name == 'senseshield.exe':
return True
else:
return False
if __name__ == "__main__":
# 安装用户工具
if not is_exist_user_tool():
print("#" * 10, "开始安装用户工具")
start_sense()
else:
print("#"*10, "已经安装了用户工具")
# 启动机密后的算法程序
start_tj()
demo1.py 如下
# -*- coding:utf-8 -*-
"""
CreateBy: dai.chao
Date: 2023/02/02
1. 首先把用户程序程序打包进去
2. 安装用户程序,启动主程序
"""
import subprocess as sp
import os
def package():
# cmd_str = 'pyinstaller -F --key naura demo.py --add-data ".\\sense;.\\sense" --add-data ".\\alg;.\\alg" --noconfirm '
# -w 不要cmd 窗口
cmd_str = 'pyinstaller -F --key naura demo.py --add-data ".\\sense;.\\sense" --add-data ".\\alg;.\\alg" -w --noconfirm '
res = sp.Popen(cmd_str, shell=True, cwd=os.getcwd())
res.wait()
print('code:', res.returncode)
if __name__ == "__main__":
package()
运行demo1.py 即可生成一个dist的目录,该目录下生成的demo.exe 就是我们打包好的可执行程序