分类目录归档:发布

PyQt程序的打包

记录下PyQt程序的打包。

一,安装

pip3 install PyInstaller

二,打包

pyinstaller -w -n app app.py 
根据需要选择打包参数,例如:

-F表示生成单文件模式,即只有一个可执行文件,比如windows下的exe。执行会比较慢。
-w表示生成窗口模式,即不显示控制台窗口
-i表示指定图标文件,例如-i icon.ico
-n表示指定输出文件名,例如-n app.exe

三,执行

打包后的程序位于 dist文件下。

具体程序 参考:

PyQt 入门

树莓派下开机自启的Qt程序配置

一,需求

Qt开发的GUI程序,部署到树莓派中,并设置开机自启。

二,步骤

1,制作启动脚本和停止脚本。

我们需要编写两个脚本,来启动和停止我们的应用。这里假设我们的应用名称为test。

#启动脚本
#!/usr/bin/env bash

#设置环境变量
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/test

cd /usr/test

#启动主程序
./test
#停止脚本
#!/usr/bin/env bash

ID=` ps -ef | grep test | grep -v grep | awk '{print $2}'`

for id in $ID
do
kill -9 $id
done

2,制作安装脚本

我们需要编写一个脚本用于安装qt打包后的程序,也就是整个文件夹。脚本的作用就是将文件夹拷贝到指定的位置。

比如我们的程序在test文件夹内,内部含有完整的Qt应用程序及依赖库,我们在同级目录下创建一个安装脚本 install.sh。

#!/usr/bin/env bash

Install_App() {
echo "installing test ..."
target=$1
if [ x$target == x'' ]; then
echo "please input parameter 1 for target path"
exit
fi

sudo /usr/test/stop.sh
sleep 1
if [ ! -d "$target" ]; then
sudo mkdir $target
fi
cp -a test/* $target/
#sudo chown -R root:root $target

}

if [ $UID -ne 0 ]; then
echo "Is not superuser,please use sudo "
exit
else
ROOT_PATH=/usr/test
Install_App $ROOT_PATH
echo "Install completed !"
reboot
fi

3,系统的设置

这里有两种方式。

(1),sudo vim /etc/xdg/lxsession/LXDE-pi/autostart

#@lxpanel --profile LXDE-pi
#@pcmanfm --desktop --profile LXDE-pi
#@xscreensaver -no-splash
@sudo /usr/test/start.sh

(2),

  1. 在/home/用户/.config下创建autostart 的文件夹
  2. 在 autostart 目录下新建my.desktop
  3. 编辑 my.desktop
[Desktop Entry]
Name=AICounter
Comment=AICounter
Exec=sudo /usr/test/start.sh
Terminal=false
MultipulArgs=false
Type=Application
Categories=Application;Development;
StartupNotify=ture

三,树莓派的一些配置

1,屏蔽开机警告

在/boot/config.txt末尾添加语句
avoid_warnings=2

2,修改欢迎界面

替换 /usr/share/plymouth/themes/pix/splash.png

3,更换软件源

sudo nano /etc/apt/sources.list
deb https://mirrors.ustc.edu.cn/debian/ bullseye main contrib non-free
deb https://mirrors.ustc.edu.cn/debian/ bullseye-updates main contrib non-free
deb https://mirrors.ustc.edu.cn/debian/ bullseye-backports main contrib non-free
deb https://mirrors.ustc.edu.cn/debian-security/ bullseye-security main contrib non-free
sudo apt-get update

4,时间相关

1,关掉网络 时间同步服务  sudo systemctl stop systemd-timesyncd.service
2,启动网络 同步时间服务 sudo systemctl start systemd-timesyncd.service
3,时间同步服务 禁止自启 sudo systemctl disable systemd-timesyncd.service
4,开机自启 时间同步服务 sudo systemctl enable systemd-timesyncd.service
5,手动修改时间 sudo date -s "2021-10-31 20:18:00"
6,date 检查时间
7,修改时区:sudo dpkg-reconfigure tzdata 亚洲 上海

要想改时间,先要修改为正确的时区

5,pcf85063a时钟芯片

/boot/configini
dtparam=i2c_arm=on
dtparam=i2c_vc=on
dtoverlay=i2c-rtc,pcf85063a,i2c_csi_dsi

6,中文支持

sudo apt-get install scim-pinyin

windows下利用NSIS制作安装包

经过程序员抓耳挠腮的开发,应用终于开发完毕了,那接下来无论发布给客户还是给测试,最好的方式时打一个安装包,直接给release文件夹,就显得不太专业了。

程序的打包分为两步:

1,将所以依赖文件收集全,确保其它非开发机器运行时,不会缺少库。

2,用第三方打包软件,制作安装包。

一,收集依赖文件

1,我们以一个QML程序为例,新建一个pkg/v1.0.0/bin文件夹,并将 release版本的pkgTest.exe拷贝到这个bin文件夹下。

2,找到对应版本的Qt命令行工具。

3,执行windeployqt.exe 执行,自动收集依赖文件。

  • windeployqt.exe 为打包工具
  • –qmldir 是自己的qml文件所在的目录,如果QWidget程序,这个参数 及后面的路径就不需要了。这个也告诉我们,我们的目录结构最好将所有自定义的qml文件放到一起,便于打包。
  • 自定义qml文件所在的路径
  • pkgTest.exe 我们的主程序

4,这个指令只能收集一部分程序,执行后自己双击一下主程序(pkgTest.exe),看还缺啥,手动拷贝一下。最可靠的办法是找一台非开发机器验证。

二,打包工具打包

我习惯使用NSIS+HM NIS EDIT 这两个工具进行打包,原因就是颗粒度更细,可以控制环境变量、自启动等。并且官网提供了大量的插件,设置上更加的自由。

1,安装打包工具 NSIS ,这个是一个基础的库( https://nsis.sourceforge.io/Download

2,安装编辑器,这是配套使用的一个编辑器。只用上边那个也可以,只是加上这个更方便(https://hmne.sourceforge.net/

3,使用。我们第一步可以建立一个向导,按照向导,一步一步操作。

安装语言可以自己选择,一个或者多个都可以。

选择目录这一步很关键,把自带的两个删掉,然后指定我们的主程序的父目录,也就是bin文件夹。

之后下一步,下一步,选择将脚本保存,便于后期修改。

最后就是编译脚本,生成安装包。

安装包生成到了脚本所在目录,双击可以自己验证下。

三,NSIS 指令

NSIS 官网提供了大量的插件(https://nsis.sourceforge.io/Category:Plugins),自己可以根据业务需要去下载,并且它本身也有大量的指令,可以支持更高的定制化需求。

1,静默安装。 比如安装其他依赖的exe,不想弹出来提示框,让其他在后台默默执行。

SilentInstall silent 
SilentUninstall silent
比如 下边的代码,将Video.exe 在后台执行
SilentInstall silent 
SilentUninstall silent 
Section "MainSection" SEC01
  SetOutPath "$INSTDIR"
  SetOverwrite try
  File "path_1.0.1\Video.exe"
SectionEnd

2,安装后运行指定程序

Function .onInstSuccess
ExecShell "" "$INSTDIR\Video.exe"
FunctionEnd

3,安装后 开机自启。其实就是写注册表

WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Run""Video" "$INSTDIR\Video.exe" ; 开机自启

DeleteRegValue HKCU "Software\Microsoft\Windows\CurrentVersion\Run" "Video" ;卸载开机启动

4,杀死某个进程。 可以用在安装时,确保当前程序已经被关掉。

需要下载插件:https://www.cnblogs.com/chechen/p/11125353.html

Function .onInit
KillProcDLL::KillProc "Video.exe" ;杀进程
Sleep 1000
FunctionEnd

某些进程杀不掉 用这个:

Function .onInit
ExecCmd::exec '"taskkill" /F /IM hiclass.exe /T'
FunctionEnd

5,管理员运行

WriteRegStr HKCU "Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers" "$INSTDIR\Video.exe" "RUNASADMIN" ;管理员运行 

6,安装vc环境

; 安装VC环境
Function .onInstSuccess
Push $R0
ClearErrors
ReadRegStr $R0 HKLM "SOFTWARE\Classes\Installer\Dependencies\{e2803110-78b3-4664-a479-3611a381656a}" "Version"

; 检测含有vc的注册表信息是否存在
IfErrors 0 VSRedistInstalled
Exec "$INSTDIR\vcredist_msvc2015_x86.exe /q" ;若不存在,执行静默安装
StrCpy $R0 "-1"
;MessageBox MB_OK $R0

VSRedistInstalled:
;MessageBox MB_OK "已安装"
pop $R0
; Delete "$INSTDIR\vcredist_msvc2015_x86."
FunctionEnd

7,检测是否是xp系统

需要安装插件: https://blog.csdn.net/xt2zsun/article/details/79379098

#检测 Windows 7
var isWindowsXP
Section
Version::IsWindowsXP
#获取值
Pop $isWindowsXP
${if} $isWindowsXP == "1"
MessageBox MB_OK "暂不支持XP系统,请升级到Win7及以上!"
Quit
${EndIf}
SectionEnd

8,右键属性 添加信息

VIProductVersion "${PRODUCT_VERSION}" ;版本号,格式为 X.X.X.X (若使用则本条必须)
VIAddVersionKey /LANG=2052 "ProductName" "我的程序" ;产品名称
VIAddVersionKey /LANG=2052 "Comments" "这是我写的一个测试程序" ;备注
VIAddVersionKey /LANG=2052 "CompanyName" "我的公司名称" ;公司名称
VIAddVersionKey /LANG=2052 "LegalTrademarks" "Test Application is a trademark of Fake company" ;合法商标
VIAddVersionKey /LANG=2052 "LegalCopyright" "Copyright (c) 2019 我的公司版权" ;合法版权
VIAddVersionKey /LANG=2052 "FileDescription" "我的文件描述" ;文件描述(标准信息)
VIAddVersionKey /LANG=2052 "FileVersion" "${PRODUCT_VERSION}" ;文件版本
VIAddVersionKey /LANG=2052 "ProductVersion" "${PRODUCT_VERSION}" ;产品版本

9,判断文件是否存在,用于检验插件是否安装

;存在执行 第三行,不存在执行第二行  不存在+1 行
IfFileExists "C:\Program Files (x86)\WinPcap\rpcapd.exe" +3 +2
MessageBox MB_OK "已安装" ;占位 无实际作用
ExecWait '"$INSTDIR\WinPcap_4_1_3.exe" '

10,删除及创建快捷方式

Delete "$DESKTOP\快乐魔法狮.lnk"
SetOutPath "$INSTDIR"
CreateShortCut "$DESKTOP\快乐魔法狮.lnk" "$INSTDIR\hidteacher.exe"

11,创建环境变量。

EnVar::DeleteValue "vi_algorthmCall_tool_root"
EnVar::AddValue "vi_algorthmCall_tool_root" "$INSTDIR"