微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 Windows 上自行重启的 Python 脚本

如何解决在 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 中正确执行此操作?

解决方法

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

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。