基于windows平台 PyQt5 程序打包后安装开机自动运行

目录

 

1.背景        

2.使用的打包技术 FBS   

3.三种基于windows平台软件自启动方案

4. 操作实验

       4.1 Run/RunOnce Key 添加注册表的方式

       4.2 Start Menu/Startup Folder

5.总结


 

1.背景        

        本文主要实现了基于windows平台,使用PyQt5技术开发、打包软件,当用户安装完成后,软件会自动运行的效果。

 

2.使用的打包技术 FBS   

        这里我使用的PyQt打包软件为FBS,官方文档地址:https://build-system.fman.io/,官方教程https://github.com/mherrmann/fbs-tutorial。文档比较详实,经过项目的打包过程学习实践后来看,该打包框架确实简单,繁琐的打包任务一行命令就可以解决,具体使用方法这里不再赘述。

        通过学习可以发现,fbs官网教程基于windows平台打包发布,有这样一段描述: Before you can use the installer command on Windows, please install NSIS and add its installation directory to your PATH environment variable. 如果想要打包发布项目,需要使用的是NSIS(专门用于制作window安装程序的工具软件)。从官网上下载安装后,需要配置下环境变量才可以使用。

        如下图所示,为本文使用的fbs创建的项目结构,提供参考:

 

3.三种基于windows平台软件自启动方案

    下面进入文本的正题,如何进行项目的配置,来达到软件安装后的自启动。文本参考的一篇文献为nsis-start-program-automatically-when-windows-starts

        总结下来,有三种方式可以来实现这个目的:

         1. 通过添加Run  或者 RunOnce 注册表的方式;

         2.在windows平台的Start Menu/Startup 文件夹下创建快捷方式;(最终使用的方案)

         3.通过将程序注册为服务的方式,但是我们的项目是GUI程序,不支持这种方式,所以该方法暂时不考虑。

4. 操作实验

     打包pyqt项目使用的是fbs打包工具,所以通过上面有关fbs的学习,我们可以在项目/src/installer/windows下创建文件Installer.nsi.

4.1 Run/RunOnce Key 添加注册表的方式

WriteRegStr HKLM “Software\Microsoft\Windows\CurrentVersion\Run” “Monitor” “X:\Monitor.exe”

WriteRegStr HKCU “Software\Microsoft\Windows\CurrentVersion\Run” “Monitor” “X:\Monitor.exe”

     需要说明的是,HKLM(HKEY_LOCAL_MACHINE)是针对计算机系统所有用户而言的,HKCU(HKEY_CURRENT_USER)是针对当前用户而言的。 

     NSIS 给出的实例代码截图(https://nsis.sourceforge.io/Running_a_.exe_file_on_Windows_Start):

          这里我项目里面所做的具体尝试步骤如下:

          a) 修改初始化部分脚本:

           b)添加写入注册表代码:

            c) 在用户删除软件的时候,同时删除注册表:

 

        最终打包软件发布后,安装一路next没有问题,点击exe打开软件也没有问题。接着把电脑关机,重新开机出现了

        这里我进行了很多的尝试,打包后的软件运行没有问题,但是打包之后,放到系统自启动注册表里面就有这样的问题。我使用的python版本为3.7。FBS打包软件官网上说目前只支持python3.5 3.6版本,3.7版本没有经过测试,所以可能版本上出现了问题,如果你找到了解决的办法,请留言。 

4.2 Start Menu/Startup Folder

       该方法是我觉得最简单的方法,不用去写、删除注册表,直接在window的Start Menu目录下创建快捷方式,当windows系统启动后最自动打开软件,所以项目最终使用了这种方案。

      同样的是在installer.nsi 编写了相关的配置文件:

         最后一行命令,解决问题,打包后的软件在target目录下:

5.总结

       本文最终解决了pyqt5项目如何实现安装包安装后开机自启动的问题,达到了最初的目标,这汇总了我的Installer.nsi配置文件代码最终展示如下:

!include MUI2.nsh
!include FileFunc.nsh

;--------------------------------
;Perform Machine-level install, if possible

!define MULTIUSER_EXECUTIONLEVEL Highest
;Add support for command-line args that let uninstaller know whether to
;uninstall machine- or user installation:
!define MULTIUSER_INSTALLMODE_COMMANDLINE
!include MultiUser.nsh
!include LogicLib.nsh


Function .onInit
  !insertmacro MULTIUSER_INIT
  ;Do not use InstallDir at all so we can detect empty $InstDir!
  ${If} $InstDir == "" ; /D not used
      ${If} $MultiUser.InstallMode == "AllUsers"
          StrCpy $InstDir "$PROGRAMFILES\${app_name}"
      ${Else}
          StrCpy $InstDir "$LOCALAPPDATA\${app_name}"
      ${EndIf}
  ${EndIf}
FunctionEnd

Function un.onInit
  !insertmacro MULTIUSER_UNINIT
  ;DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Run"
FunctionEnd

;--------------------------------
;General

  Name "${app_name}"
  OutFile "..\${installer}"

;--------------------------------
;Interface Settings

  !define MUI_ABORTWARNING

;--------------------------------
;Pages

  !define MUI_WELCOMEPAGE_TEXT "This wizard will guide you through the installation of ${app_name}.$\r$\n$\r$\n$\r$\nClick Next to continue."
  !insertmacro MUI_PAGE_WELCOME
  !insertmacro MUI_PAGE_DIRECTORY
  !insertmacro MUI_PAGE_INSTFILES
    !define MUI_FINISHPAGE_NOAUTOCLOSE
    !define MUI_FINISHPAGE_RUN
    !define MUI_FINISHPAGE_RUN_CHECKED
    !define MUI_FINISHPAGE_RUN_TEXT "Run ${app_name}"
    !define MUI_FINISHPAGE_RUN_FUNCTION "LaunchLink"

  !insertmacro MUI_PAGE_FINISH

  !insertmacro MUI_UNPAGE_CONFIRM
  !insertmacro MUI_UNPAGE_INSTFILES

;--------------------------------
;Languages
  !insertmacro MUI_LANGUAGE "SimpChinese"
  !insertmacro MUI_LANGUAGE "English"

;--------------------------------
;Installer Sections

!define UNINST_KEY \
  "Software\Microsoft\Windows\CurrentVersion\Uninstall\${app_name}"
Section
  SetOutPath "$InstDir"
  File /r "..\${app_name}\*"
  WriteRegStr SHCTX "Software\${app_name}" "" $InstDir
  WriteUninstaller "$InstDir\uninstall.exe"
  CreateShortCut "$SMPROGRAMS\${app_name}.lnk" "$InstDir\${app_name}.exe"
  WriteRegStr SHCTX "${UNINST_KEY}" "DisplayName" "${app_name}"
  WriteRegStr SHCTX "${UNINST_KEY}" "UninstallString" \
    "$\"$InstDir\uninstall.exe$\" /$MultiUser.InstallMode"
  WriteRegStr SHCTX "${UNINST_KEY}" "QuietUninstallString" \
    "$\"$InstDir\uninstall.exe$\" /$MultiUser.InstallMode /S"
  WriteRegStr SHCTX "${UNINST_KEY}" "Publisher" "${author}"
  ${GetSize} "$InstDir" "/S=0K" $0 $1 $2
  IntFmt $0 "0x%08X" $0
  WriteRegDWORD SHCTX "${UNINST_KEY}" "EstimatedSize" "$0"

  ; CREATE SHORT_CUT
  CreateDirectory "$SMPROGRAMS\${app_name}"
  CreateShortCut "$DESKTOP\${app_name}.lnk" "$INSTDIR\${app_name}.exe"
  ; SET AUTO_BOOT
  CreateShortCut "$SMSTARTUP\${app_name}.lnk" "$INSTDIR\${app_name}.exe" ""
  ;WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Run" "${app_name}" "$\"$INSTDIR\${app_name}.exe$\""
SectionEnd



;--------------------------------
;Uninstaller Section

Section "Uninstall"
  RMDir /r "$InstDir"
  Delete "$SMPROGRAMS\${app_name}.lnk"
  Delete "$DESKTOP\${app_name}.lnk"
  Delete "$SMSTARTUP\${app_name}.lnk"
  DeleteRegKey /ifempty SHCTX "Software\${app_name}"
  DeleteRegKey SHCTX "${UNINST_KEY}"
  ;DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Run"
SectionEnd

Function LaunchLink
  !addplugindir "."
  ShellExecAsUser::ShellExecAsUser "open" "$SMPROGRAMS\${app_name}.lnk"
FunctionEnd

 

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
PyQt5是一个用于开发图形用户界面(GUI)的Python库。当我们使用PyQt5开发了一个程序后,可以通过打包工具将程序打包成可执行文件,方便在其他机器上运行。然而,在有些情况下,打包后的程序可能无法正确运行,原因可以归结为以下几点: 1. 缺少依赖库:PyQt5依赖于一些其他的库,如Qt、Python等。在打包时,如果没有正确的将这些依赖库一同打包,就会导致程序无法正确运行。因此,在打包前,需要确保将所有依赖库包括进来,以免出现缺少依赖的情况。 2. 版本冲突:PyQt5有不同的版本,而每个版本可能有其特定的要求和兼容性。如果打包时使用了与开发时不同的PyQt5版本,就可能会出现兼容性问题,导致程序无法正确运行。因此,在打包时,需要确保使用与开发时相同的PyQt5版本。 3. 资源文件路径问题:在PyQt5开发中,我们通常使用一些资源文件,如图标、图片等。在打包时,可能会出现资源文件路径不正确的问题,导致程序无法找到这些资源文件,进而引发程序运行错误。因此,需要在打包时正确设置资源文件路径。 4. 编码问题:在打包后的程序中,可能会出现编码问题,如字符显示不正确、乱码等。这可能是由于打包工具不正确地处理了程序的编码方式,或者程序中使用了特殊的字符编码等原因。因此,需要确保在打包时正确设置编码方式。 综上所述,PyQt5打包程序无法正确运行的原因可能包括缺少依赖库、版本冲突、资源文件路径问题和编码问题等。在进行打包时,需要注意解决这些问题,以确保程序能够正确运行

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值