- exe打包
注意:
虚拟环境依赖包(打包成requirements.txt):
pip install -r requirements.txt
安装项目依赖 pip install requirements.txt
- 环境准备
- 安装虚拟环境
pip install pyinstaller
pyinstaller -F xxxxxxx.py
生成xx.exe
Requirements.txt:
altgraph==0.17.2
future==0.18.2
pefile==2022.5.30
pyinstaller==5.2
pyinstaller-hooks-contrib==2022.8
pywin32-ctypes==0.2.0
- 打包
3.1多文件打包
- 调试,在终端输入app.exe回车,可以看到报错(不是双击运行)
-
3.2单文件打包
pyinstaller -F xxxxxxx.py
3.2.1打包的名称:
pyinstaller -F app.py -n bb
3.3 路径问题
3.3.1 多文件打包,不会报错
3.3.2 单文件打包,报错
为什么报错呢?
运行单文件打包的,会解压到电脑的临时目录(具体报错如下)
3.3.1 sys.argv (当前文件执行所在目录文件)
import sys
print(sys.argv)
print(sys.argv[0])
执行返回:
['C:/Users/DELL/PycharmProjects/pyinstaller-g/demo.py']
C:/Users/DELL/PycharmProjects/pyinstaller-g/demo.py
执行文件(只有文件):
import sys,os
#找到真正的路径
print(os.path.realpath(sys.argv[0]))
print(sys.argv)
运行:
区别如下:
import time,os,sys
# BASE_DIR =os.path.dirname(os.path.abspath(__file__))
BASE_DIR = os.path.dirname(os.path.realpath(sys.argv[0]))
print(BASE_DIR)
print("环境使用xxxx系统")
path = os.path.join(BASE_DIR,"account.txt")
with open(path,"r",encoding="utf-8") as file:
data = file.read().strip()
print(data)
time.sleep(5)
3.4 模块导入问题
满足要求
但是,如何遇到动态导入模块的代码,他是无法找到关联包
import time,sys
import importlib
print("=================欢迎使用xxx系统===================")
card = importlib.import_module("utils.card")
v1 = card.get_number()
print(v1)
time.sleep(5)
动态导入报错:
手动写入要导入的包(在bb.spec文件里)
打包命令:
报错:
-F要去掉
pyinstaller bb.spec(原来的打包命令会把spec文件给覆盖掉,)
运行成功
如果遇到:
使用:
pyinstaller --add-data="C:\softwork\Python\Python39\Lib\site-packages\pyecharts;pyecharts" -F run_main.py
通过文件导包:
datas=[('C:\\softwork\\Python\\Python39\\Lib\\site-packages\\pyecharts', 'pyecharts'), ('C:\\softwork\\Python\\Python39\\Lib\\site-packages\\openpyxl', 'openpyxl'),('C:\\softwork\\Python\\Python39\\Lib\\site-packages\\pymysql', 'pymysql')]
如下图:
# -*- mode: python ; coding: utf-8 -*- block_cipher = None a = Analysis( ['run_main.py'], pathex=[], binaries=[], datas=[('C:\\softwork\\Python\\Python39\\Lib\\site-packages\\pyecharts', 'pyecharts'), ('C:\\softwork\\Python\\Python39\\Lib\\site-packages\\openpyxl', 'openpyxl'),('C:\\softwork\\Python\\Python39\\Lib\\site-packages\\pymysql', 'pymysql')], hiddenimports=["pyecharts","openpyxl.load_workbook","et-xmlfile","pymysql"], 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='run_main', 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, )
运行成功: