当前位置:   article > 正文

Python_Project_nuitka_inno_setup_nuitka --include-data-dir

nuitka --include-data-dir

VideoDown Project

如果按照往常开发中的环境项目结构,加上需要的依赖,一套运行环境下来大概在400MB左右

其中PySide6 就有150MB

使用嵌入式Python,结合打包封装,具有一定操作性,打包后大小 40MB,封装完20MB

注意一定需要:requirements 虚拟环境依赖文件包

第一步、梳理项目结构

projects
├─gui_py
|  ├─download
│  └─.*.py
├─static
│  ├─settings
|  ├─.*.json
|  ├─.*.bat
|  ├─requirements
|  └─img
|     └─svg_icons
└─main.py

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

结构说明:项目拆分为三个部分

第一部分 gui_py文件,为具体脚本或项目内容结构,包含pygui文件等,

包含一些脚本整个项目配置文件,

注意事项:路径使用的路径需要使用os模块对项目操作,

例如引入外部static文件内容可以为以下三种形式

os.path.dirname(os.path.abspath(__file__))
os.path.abspath(os.getcwd())
"static/ima/svg_icons/..."
  • 1
  • 2
  • 3

错误形式例如

"projects/static/ima/svg_icons/..."
  • 1

第二部分 static文件,为静态资源,包含配置文件,数据文件,日志文件,图片视频等静态资源文件

第三部分 main.py文件,为入口执行文件

示例:是一段入口文件,单独剥离出来即可


import os
import sys

# IMPORT QT CORE
# ///


from PySide6.QtGui import QIcon
from PySide6.QtWidgets import QMainWindow, QApplication

from gui.core.json_settings import Settings
from gui.uis.windows.main_window import UI_MainWindow, SetupMainWindow
from gui.uis.windows.main_window.functions_main_window import MainFunctions

# MAIN WINDOW
# ///
class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        ...
        ...
    ......

app = QApplication(sys.argv)
app.setWindowIcon(QIcon("icon.ico"))
window = MainWindow()

# EXEC APP
# ///
sys.exit(app.exec())
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

第二步、Nuitka,打包

1、安装Nuitka打包工具

pip install nuitka

# 如果安装比较慢,可以尝试使用镜像源
pip install -i https://pypi.douban.com/simple/   nuitka
  • 1
  • 2
  • 3
  • 4

2、安装mingw64

网站:https://sourceforge.net/projects/mingw-w64/

具体文件下载

32位下载:https://sourceforge.net/projects/mingw-w64/files/
找到MinGW-W64 GCC-8.1.0
点击 i686-win32-sjlj 下载
  • 1
  • 2
  • 3

在这里插入图片描述

64位下载:https://sourceforge.net/projects/mingw-w64/files/
找到MinGW-W64 GCC-8.1.0
点击 x86_64-win32-sjlj 下载
  • 1
  • 2
  • 3

在这里插入图片描述

下载后解压,配置环境变量,不会配置环境变量可以看看文章

https://blog.csdn.net/qq_42475194/article/details/108548359

直接看第六步

环境路径为

bin目录路径
  • 1

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

3、使用Nuitka打包

nuitka 
--standalone  
--include-data-dir=static=static 
--mingw64 
--show-progress 
--nofollow-import-to
--follow-import-to=gui  
--windows-icon-from-ico=E:\Download_DL\......\static\images\icon.ico   
--output-dir=E:\Download_DL\......\build  
main.py
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

可复制直接使用命令

nuitka --standalone  --include-data-dir=static=static --mingw64 --show-progress --nofollow-imports --follow-import-to=gui  --windows-icon-from-ico=E:\Download_DL\...\icon.ico  --nofollow-import-to=PySide6,pyside6,shiboken6 --output-dir=E:\Download_DL\...\build  main.py
 
 # 修改--windows-icon-from-ico
 # 修改--follow-import-to=
 # 修改--output-dir=
 # 修改  main.py
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

命令说明:

standalone  :分发文件,打包出来的内容指向 .dist 文件
扩展:其中如果是单个文件,可以使用:onefile
  • 1
  • 2

在这里插入图片描述

include-data-dir :复制包含所有文件的整个文件夹,顾名思义,打包完后,该文件会保留在打包内容中
扩展:复制目录中的部分或全部文件:include-data-file=<source>=<target>
官方表示还有更好的自动检测包数据并复制:-include-package-data (但未测试)

我这里将自己的静态文件保存,static=static 
  • 1
  • 2
  • 3
  • 4
  • 5
mingw64:c构建 如果在运行中提示下载缓存工具,可以点击Yes
  • 1
show-progress:显示进度
  • 1
nofollow-import-to:有选择地排除需要编译导入的模块
例如我们在main.py文件中 导入PySide6
那么在编译时候,会将PySide6进行提取,但这是不完全的,所以可以在编译完后删除,或者是在`main.py`文件中调整导入
  • 1
  • 2
  • 3
follow-import-to:指定需要导入的文件夹,也就是 本次目录结构中的 gui 文件
  • 1
windows-icon-from-ico: exe图标icon
  • 1
output-dir : 打包后放在那个地方,这里就是指定输出路径
  • 1

以上是打包DEBUG环境

后面配置好依赖,启动exe程序会开启命令行和exe桌面应用

正式使用需要加上: --windows-disable-console
没有控制台的 Windows 程序不会出错,
出于调试目的,删除--windows-disable-console或使用上述选项--windows-force-stdout-spec和 --windows-force-stderr-spec路径 --windows-onefile-tempdir-spec
  • 1
  • 2
  • 3

正式命令

nuitka 
--standalone
--mingw64
--windows-disable-console
--include-data-dir=static=static 
--show-progress 
--nofollow-import-to
--follow-import-to=gui  
--windows-icon-from-ico=E:\Download_DL\......\static\images\icon.ico   
--output-dir=E:\Download_DL\......\build  
main.py
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

配置时间不会很慢,大概三分钟以内,会将python环境编译成pyddll相关文件

在这里插入图片描述

以上不一一展示,编译完成后,路径打开后缀为.dist文件夹
.build 文件可以放置一边不用操作
然后找到主运行程序。
  • 1
  • 2
  • 3

在这里插入图片描述

在这里插入图片描述

编译过的文件结构如下

main.dist
├─static
│  ├─settings
|  ├─.*.json
|  ├─.*.bat
|  ├─requirements
|  └─img
|     └─svg_icons
├─main.exe
├─......dll
└─......dll

# 现有的结构为 main.dist  为项目基础
# static 为静态文件保持不变
# main.exe为主程序入口
# 一些编译好的dll和pyd文件
# 内置环境已经完成,开始集成依赖环境
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

4、配置依赖环境

'''
配置依赖环境建议使用脚本形式操作
windwos环境,可以使用基本的dos操作方法,
加上Python嵌入式环境,基本可以操作
先配置 pip 命令
再配置 安装操作
'''
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

进入Python官方下载网站

https://www.python.org/downloads/windows/

找到对应版本的python
 Windows x86-64 embeddable zip file  64位
 Windows x86 embeddable zip file     32位
  • 1
  • 2
  • 3
  • 4
  • 5

在这里插入图片描述

我下载的64位,因为PySide6暂时只支持64位下载

下载后解压文件夹
  • 1

在这里插入图片描述

实际上 只需要复制几个文件即可,因为再进行编译配置的时候,已经将Python的基本环境配置好,
只需要配置一些安装pip的配置环境即可
  • 1
  • 2

在这里插入图片描述

此时将文件复制到static文件夹中,新建立一个lib_文件,将文件拷贝到此文件夹中

名称都可以随意 site-packge
  • 1
  • 2
  • 3

在这里插入图片描述

获取`apt_get.py`文件

打开`https://bootstrap.pypa.io/get-pip.py`

直接复制内容 保存到本地文件
  • 1
  • 2
  • 3
  • 4
  • 5
开始编写bat脚本
文件放置再static 目录下
  • 1
  • 2
# 此时目录结构如下

main.dist
├─static
│  ├─lib_
|  |  ├─python.cat
|  |  ├─python.exe
|  |  ├─python38._pth
|  |  ├─python38.zip
|  |  └─pythonw.exe
|  ├─apt_get.py
|  ├─install_packge.bat
|  ├─requirements
|  └─img
|     └─svg_icons
├─main.exe
├─......dll
└─......dll

# 其中install_packge.bat 脚本为windows环境下执行脚本,逻辑上通用,配置环境
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

脚本如下

cd /d %~dp0

cd ../

set path=%cd%


for /f  %%i in ('dir "%path%"\\static\\lib_  /b') do (
move "%path%\\static\lib_\\%%i"   "%path%"
echo "%path%\\static\\lib_\\%%i"   "%path%"
)

"%path%\\python"  "%path%"\\static\\apt_get.py

"%path%\\Scripts\\pip" install --upgrade pip

"%path%\\\Scripts\\pip" install  -t "%path%"   -i https://pypi.douban.com/simple/  -r "%path%\\static\\requirements"

pause
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

说明 补充一下
"%path%" dos 下 有些文件夹是带有空格 需要加入双引号 扩住路径

cd /d %~dp0    : %~dp0 表示当前环境目录  cd 表示切换目录
cd ../         : 表示切换上一层目录 也就是根目录
set path=%cd%  : %cd% 表示当前路径, 定义变量path 将 路径赋值给path

for /f  %%i in ('dir %path%\\static\\lib_  /b') do (
move "%path%\\static\lib_\\%%i"   "%path%"
echo "%path%\\static\\lib_\\%%i"   "%path%"
)

这里几段for循环操作 主要目的是为了循环遍历文件,然后将文件移动至指定文件夹下 也就是根目录(main.dist)下:
%path%\\python  %path%\\static\\apt_get.py  :使用python 命令 运行apt_get.py文件 安装pip文件

%path%\\\Scripts\\pip install  -t  %path%  -r  %path%\\static\\requirements  :使用安装好的 pip 安装依赖文件

重点:-t  %path%  指定pip 安装环境至 指定路径


pause : 可加可不加, 目的是为了暂停命令行,查看具体情况
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

此时可以测试使用脚本,直接点击运行

在这里插入图片描述

在这里插入图片描述

根目录下,一些需要的依赖文件
  • 1
测试 点击 exe 程序查看是否可以运行,如果可以运行,即可将static 文件作为 开发中迭代更新文件,进行保存

此时若打开 exe 程序 会弹出命令行的框,那么在编译时候加上
--windows-disable-console
即可
  • 1
  • 2
  • 3
  • 4
  • 5

第三步、inno setup 封装

1、 下载安装 inno setup

https://jrsoftware.org/isdl.php
选择Random site 或有快捷方式即可
正常安装即可
  • 1
  • 2
  • 3

在这里插入图片描述

2、配置项目

安装成功后
开始配置项目
  • 1
  • 2

创建新文件

在这里插入图片描述

点击Next

在这里插入图片描述

应用信息

Application name:      应用名称 必填
Application version:   应用版本 必填
Application publisher: 应用创作人或公司 非必填
Application website:   应用web站点     非必填 (没有就不用填写)
  • 1
  • 2
  • 3
  • 4

在这里插入图片描述

应用文件

'''
Application destination base folder: 应用程序目标基础文件夹
Application folder name:             应用程序文件夹名称   这里是表示安装后,应用名称
Allow user to ghange the application folder:允许用户改变应用程序文件夹
也就是表述 在安装的时候,选择安装目录,原本安装到C盘,可以更改到D盘
other
The application doesn't need a folder:应用程序不需要文件夹
'''
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

在这里插入图片描述

应用程序文件

Application main executable file: 应用程序主可执行文件  选择exe文件
Allow user to start the application after Setup has finished:
允许用户在安装完成后启动应用程序
The application doesn't have a main executable file :应用程序没有主可执行文件

下方添加主目录 也就是本程序的main.dist文件夹
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

在这里插入图片描述

Associate a file type to the main executable :将文件类型与主可执行文件关联
Application file type name:应用程序文件类型名称
Application file type extensionexel:应用程序文件类型
这里填写为exe即可
  • 1
  • 2
  • 3
  • 4

在这里插入图片描述

应用程序的快捷方式

Create a shortcut to the main executable in the Start Menu Programs foldert :
在"开始菜单程序"文件夹中创建主可执行文件的快捷方式

Application Start Menu folder name: 应用程序开始菜单文件夹名称

Allow user to change the Start Menu folder name :允许用户改变开始菜单文件夹名称

Allow uSer to disable Start Menu folder creation :允许用户改变开始菜单文件夹名称
Create an Internet shortcut in the Start Menu folder :在“开始菜单”文件夹中创建Internet快捷方式
Create an Uninstall shor tcut in the Start Menu folder :在开始菜单文件夹中创建一个卸载快捷方式
Other shortcuts to the main executable: 主可执行文件的其他快捷方式
Allow user to create a desktop shortcut :允许用户创建桌面快捷方式
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

在这里插入图片描述

应用程序文档

Please specify which documentation files should be shown by Setup during installation:
请指定安装过程中安装程序应该显示哪些文档文件

license file :许可文件
Information file shown hefore installation:安装前显示的信息文件
Information file shown after installation :安装后显示的信息文件
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

在这里插入图片描述

安装运行方式

Administrative install mode (install for all users):管理安装模式(为所有用户安装)
Non administrative install mode finstall for current user only):非管理安装模式安装仅适用于当前用户)

Allow user to gverride the install mode via the command line:允许用户通过命令行控制安装模式
Ask the user to choose the install mode at startup: 要求用户在启动时选择安装模式
  • 1
  • 2
  • 3
  • 4
  • 5

在这里插入图片描述

语言配置

注意中文配置,可以网上获取
https://jrsoftware.org/files/istrans/
然后保存至Inno Setup 6\Languages 文件夹下
  • 1
  • 2
  • 3

在这里插入图片描述

在这里插入图片描述

编译器设置

Custom compiler outout folder: 自定义编译器输出文件夹:
Compiler outout hase file name: 编译器输出hase文件名
Custom Setun icon file: 自定义Setun图标文件
Setup password:设置密码
  • 1
  • 2
  • 3
  • 4

在这里插入图片描述

Inno设置预处理器

Yes, use #define compiler directives :是的,使用#define编译器指令
  • 1

在这里插入图片描述

Finish

在这里插入图片描述

Inno Setup CompilerWould you like to compile the new script now?:
你现在想编译新脚本吗?

这里选择否
  • 1
  • 2
  • 3
  • 4

保存配置文件

在这里插入图片描述

再[RUN]中加入需要执行的脚本文件

Filename: "{app}\static\install_packge.bat"; StatusMsg: "InstallDependency package file"; Flags: skipifsilent
  • 1

在这里插入图片描述

加入完保存

最后点击上方运行按钮编译

在这里插入图片描述

弹出在编译之前保存脚本,点击是,保存
在这里插入图片描述

提示是否安装,点击取消即可,或者可以直接安装,也可以直接去输出文件夹安装

在这里插入图片描述

然后找到封装好的应用

在这里插入图片描述

以上就是打包封装,如果有了解可以咨询,后面可以出一个视频操作

2021/11/26 补充:
1、windows-disable-console Parameter Usage problem(windows 禁用控制台并重定向文件输出位置)
https://github.com/Nuitka/Nuitka/issues/1283

2、innosetup脚本集成进度条

[Code]
procedure SetProgressBarMax(Ratio: Integer);
begin
  WizardForm.ProgressGauge.Max := WizardForm.ProgressGauge.Max * Ratio;
end;
 
procedure UpdateProgressBar(Position: Integer);
begin
  WizardForm.ProgressGauge.Position := Position * WizardForm.ProgressGauge.Max div 100;
end;



[Run]
Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent; BeforeInstall:SetProgressBarMax(200);
Filename: "{app}\static\install_packge.bat";  StatusMsg: "Don't worry, just wait a minute"; Flags: skipifsilent runhidden; BeforeInstall: UpdateProgressbar(90); AfterInstall: UpdateProgressBar(200); 

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/694748
推荐阅读
相关标签
  

闽ICP备14008679号