gpt4 book ai didi

python - 为 PyQt 实现自动更新功能的正确方法

转载 作者:行者123 更新时间:2023-12-02 04:30:49 27 4
gpt4 key购买 nike

我即将完成 Windows 的 PyQt 应用程序,我希望它能够从托管在远程服务器上的 ZIP 存档自动更新。

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

我的问题是以下哪个更合适:

  1. 通过对 python 的系统调用运行更新程序脚本并使用 python 杀死软件。
  2. 使用对批处理文件的系统调用来运行更新程序脚本,该批处理文件会在覆盖其源代码之前杀死主要软件。
  3. 将更新程序作为模块导入,并在与主软件相同的进程中执行所有操作。

如有必要,我可以提供脚本。

更新:

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

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

@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。 (第二种方法是启动脚本,导致第一种方法。)

最佳答案

我知道了。这是进程生成器现在的样子:

@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)

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

关于python - 为 PyQt 实现自动更新功能的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49019527/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com