首页 > 解决方案 > 在 Windows 上自行重启的 Python 脚本

问题描述

我正在编写一个 python 脚本来检查是否有可用的新版本,它会自行删除、复制新版本并使用相同的参数重新运行。

该代码适用于 MacOs (Linux):

def main(args):    
    if _version.__version__ == '1.0.3':
        os.remove(sys.argv[0])
        shutil.copytree('/Users/john/Projects/utils/newcode/updatest/', str(script_dir), dirs_exist_ok=True)        
        print('Updating ...')

        args.insert(0, sys.executable)

        os.chdir(_startup_cwd)
        print('Rerunning ...')
        os.execv(sys.executable, args)


if __name__ == "__main__":
    print('This is a new code!')
    main(sys.argv)

在 Windows 中它似乎也可以工作,但它一直停留在 cmd 中,直到您按“Enter”。我也尝试使用Popen它,它在 Windows 上的行为相同。

如何在 Windows 中正确执行此操作?

标签: pythonwindowspopenexecvp

解决方案


在 Windows 中,您曾经无法删除仍处于打开状态的文件。它最近似乎发生了变化(参见这个问题),但如果您打算分发您的文件,我不建议您依赖它,因为它不会在旧的 Windows 10 版本或非 10 Windows 版本上运行。

假设只要您的程序正在运行,您就不能删除它自己的源文件来替换它,实现相同结果的另一种方法是间接替换文件。为此,我看到了两种方法:

  • 要么使用不同的进程(其代码在另一个文件中),以便它可以替换主文件并在更新后启动它,这就是为什么许多程序都有一个与主程序不同的自动更新程序
  • 或者在您的程序启动时,在检查有新版本后,下载并以不同的名称保存,告诉用户重新开始使用新版本(或强制退出)。新版本在启动时会检查 olf 版本,如果找到,则将其删除。

根本问题是 Windows 不兼容 POSIX,因此在 POSIX 系统(Lunix、MacOS、...)上工作的东西不适用于 Windows。


推荐阅读