Python 在 Windows 重新启动的脚本

Python script that restarts itself on Windows

我正在编写一个 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 中正确执行?

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

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

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

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