在线安装
pip install pyinstaller
离线安装 python环境 python3.6.3 win32 注释:查看python环境支持的库类型命令 pip debug --verbose 如果是win32,需要下载pyinstaller-4.10-py3-none-win32.whl 如果是win_amd64,需要下载pyinstaller-4.10-py3-none-win_amd64.whl 通过在线安装方式,可以不用关注这个问题 在内网环境,无法通过pip命令直接安装pyinstaller库,可通过在外网环境下下载wheel 或者tz包,拷贝到内网环境进行离线安装。 pyinstaller包与版本信息如下
future==0.18.2
pefile==2021.9.3
altgraph==0.17.2
macholib==1.14
pywin32_ctypes==0.2.0
pyinstaller_hooks_contrib==2022.0
pyinstaller==4.10
(安装顺序要与此顺序一致,pyinstaller基于前面安装的库) 由于我的环境是python3.6.3,选择的都是py3版本;windows32位系统,选择win32的版本. pip命令下载包 pip download 命令(需要在有网环境)
pip download \ --only-binary=:all: \ # 对于包以及包的依赖包,都不使用二进制 --platform linux_x86_64 \ # 指定系统环境 -d \home\packs # 下载的文件的存储目录 -r requirement.txt 或 库名 # 指定要下载的库名
网页下载包
https://www.lfd.uci.edu/~gohlke/pythonlibs/(下载离线包) 注释:ctrl+f可用于网站页面搜索 注释:https://www.lfd.uci.edu/~gohlke/pythonlibs/(下载离线包),没查到pyinstaller==4.10
安装库方式 方式一:在任意目录 python -m pip install -r 包名或requirement.txt文件 --no-index --find-links wheel 或者tz包存放位置 方式二:切换到离线包存放目录下 pip install 离线包名称 安装成功后查看版本 pyinstaller -v
安装成功后,查看安装位置 Python36-32\Lib\site-packages;Python36-32\Scripts 单文件打包 单文件打包不指定生成路径:pyinstaller -F xxx.py 单文件打包指定生成路径:pyinstaller -F senceServiceUI.py --distpath D:\nvcc-pytest-case\tools\getJsonFromProtoTools\getMEssageTKUI\exe_result 打包成功后有如下提示 40955 INFO: Removing dir .\nvcc_TKUI 41256 INFO: Building COLLECT COLLECT-00.toc 43007 INFO: Building COLLECT COLLECT-00.toc completed successfully. 生成如下目录和文件 exe_result 存放exe,双击就可以运行啦 _pycache__ 存放senceServiceUI.py 编译后生成的senceServiceUI.cpython-36.pyc build 存放运行后会在同路径下生成一个build文件夹,这个文件夹的作用相当于PyInstaller的工作空间,PyInstaller运行相关的文件和日志都在这个文件夹中,打包完成后可以直接删除。 senceServiceUI.spec 单文件打包不需要改动此文件,如果是项目打包需要
项目打包-引用自己编写的py文件 资源文件打包主要包括项目中的工具,配置文件,图片,文本文件等。对于此类文件需要设置Analysis中的datas项. datas = [('项目依赖的工具类或配置文件的目录','打包后生成的目录名(一定要保持文件目录同名,否则主文件找不到依赖哦)')] a = Analysis(['主文件(用于生成spec的文件).py'], pathex=[], binaries=[], datas=[(SETUP_DIR,'data'),(CONFUG_DIR,'Conf'),(REQUEST_DIR,'RequestTool'), (MQTT_DIR,'mqttTool'),(READJSON_DIR,'ReadJsonTool')], hiddenimports=[], hookspath=[], hooksconfig={}, runtime_hooks=[], excludes=[], win_no_prefer_redirects=False, win_private_assemblies=False, cipher=block_cipher, noarchive=False) 项目打包-引用开源库 主文件导入import configparser,import requests等实际用到的开源库,pyinstaller会帮助我们打包开源库到exe 问题总结1.相对路径与绝对路径 由于项目中很多地方写了通过绝对路径方式导入,可能存在打包后,找不到互相依赖的问题 例如:双击exe提示 Traceback (most recent call last): File "tools\getJsonFromProtoTools\getMEssageTKUI\nvcc_TKUI.py", line 12, in <module> File "F:\demo\nvcc_TKUI\getMessageAndFieldsDefaultJson_TKUI.py", line 4, in <module> from Conf.Config import Read_config File "F:\demo\nvcc_TKUI\Conf\Config.py", line 74, in <module> host = config.get_mqtt('host') # IP地址 File "F:\demo\nvcc_TKUI\Conf\Config.py", line 30, in get_mqtt value = self.config.get('mqtt', param) File "configparser.py", line 781, in get File "configparser.py", line 1141, in _unify_values configparser.NoSectionError: No section: 'mqtt' File "tools\getJsonFromProtoTools\getMEssageTKUI\nvcc_TKUI.py", line 12, in <module> ModuleNotFoundError: No module named 'getMessageAndFieldsDefaultJson_TKUI' 解决方案:继续用绝对路径打包也可以,但要把文件执行时的路径打印出来,根据这个路径引入依赖 BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) sys.path.append(BASE_DIR) print("getBusinessIdDict_SceneService_PNAME_2_0.py",BASE_DIR) from Conf.Config import Read_config 2.开源包未导入问题 例如:双击exe提示 ModuleNotFoundError: No module named 'requests' 解决方案:主文件import requests