我差不多完成了一个针对Windows的PyQt应用程序,我希望从远程服务器上托管的ZIP存档中自动更新。
我已完成大部分更新脚本,正确下载新源并将其解压缩。我的最后一步是停止软件,替换旧源并重新启动应用程序。
我的问题是关于以下哪项更合适:
如有必要,我可以提供脚本。
更新:
所以我一直在探索所有这些方法,包括使用多处理(产生与父进程一起被杀死的子进程)和子进程。
后者显然可以单独运行子进程,这将允许我在提取新源之前关闭主应用程序。这就是我的工作:
@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
。 (第二种方法是启动脚本的方法,导致第一种方法。)
答案 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)
这将启动单独的更新程序脚本。