如何解决在 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 举报,一经查实,本站将立刻删除。