为PyQt

时间:2018-02-27 23:17:01

标签: python pyqt updates zipfile

我差不多完成了一个针对Windows的PyQt应用程序,我希望从远程服务器上托管的ZIP存档中自动更新。

我已完成大部分更新脚本,正确下载新源并将其解压缩。我的最后一步是停止软件,替换旧源并重新启动应用程序。

我的问题是关于以下哪项更合适:

  1. 通过对python的系统调用运行updater脚本并使用python终止软件。
  2. 使用对批处理文件的系统调用运行更新程序脚本,该文件会在覆盖主要软件之前终止主软件。
  3. 将更新程序作为模块导入,并在与主软件相同的过程中执行所有操作。
  4. 如有必要,我可以提供脚本。

    更新:

    所以我一直在探索所有这些方法,包括使用多处理(产生与父进程一起被杀死的子进程)和子进程。

    后者显然可以单独运行子进程,这将允许我在提取新源之前关闭主应用程序。这就是我的工作:

    @staticmethod
    def install(folder):
        # stop Pierre, unpack newest version, then restart Pierre.
        try:
            with open('pierre.pid', mode='r') as pid:
                os.kill(int(pid.read()), signal.SIGINT)
    
            with zipfile.ZipFile(file=folder) as zipped:
                zipped.extractall(path='src')
    
            try:
                pierre = os.path.join(os.path.abspath(os.getcwd()), 'src/pierre.py')
                exec(pierre)
            except OSError as exc:
                logging.error("Restarting Pierre failed. " + str(exc))
    
            try:
                os.remove('src.zip')
            except OSError as exc:
                logging.error("Deletion of zip failed. " + str(exc))
    
        except zipfile.BadZipFile:
            logging.error("Pierre update file is corrupt.")
    
        except Exception as exc:
            logging.error("Pierre update install failed. " + str(exc))
    

    什么不起作用:

    @staticmethod
    def update_process():
        # Begin the update process by spawning the updater script.
        script = 'python ' + os.getcwd() + '\\updater.py'
        subprocess.Popen([script])
    

    尽管在命令提示符下手动运行路径,但子进程正在生成FileNotFoundError。 (第二种方法是启动脚本的方法,导致第一种方法。)

1 个答案:

答案 0 :(得分:0)

我知道了。以下是流程生成器现在的样子:

@staticmethod
def update_process():
    # Begin the update process by spawning the updater script.
    script = os.path.join(os.getcwd() + '/updater.py')
    script = script.replace('\\', '/')
    subprocess.Popen([sys.executable, script], shell=True)

这将启动单独的更新程序脚本。