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 中,您曾经无法删除仍处于打开状态的文件。它最近似乎发生了变化(参见这个问题),但如果您打算分发您的文件,我不建议您依赖它,因为它不会在旧的 Windows 10 版本或非 10 Windows 版本上运行。
假设只要您的程序正在运行,您就不能删除它自己的源文件来替换它,实现相同结果的另一种方法是间接替换文件。为此,我看到了两种方法:
- 要么使用不同的进程(其代码在另一个文件中),以便它可以替换主文件并在更新后启动它,这就是为什么许多程序都有一个与主程序不同的自动更新程序
- 或者在您的程序启动时,在检查有新版本后,下载并以不同的名称保存,告诉用户重新开始使用新版本(或强制退出)。新版本在启动时会检查 olf 版本,如果找到,则将其删除。
根本问题是 Windows 不兼容 POSIX,因此在 POSIX 系统(Lunix、MacOS、...)上工作的东西不适用于 Windows。
推荐阅读
- node.js - 如何对 Id 字段执行验证?
- javascript - 将视频的上半部分绘制到画布 html
- ruby - 如何在 Ruby 中写入 Windows 文件属性?
- powerbi - 使用脱机数据保存 Power BI 报表
- javascript - 布尔变量似乎无缘无故地变为真
- python - Python:删除节点链表
- android - 缓慢构建和安装android。如何构建和安装更少的时间
- css - 跨度元素上的动态 CSS 类 - 角度 4
- java - 保持 SQLITE 连接而不打开它们 1000 次。*使用后无需打开和关闭*
- r - 如何使用 ggplot2 显示数据存储在多列中的计数条形图?