关闭Python脚本后立即重新启动

3 投票
2 回答
541 浏览
提问于 2025-04-18 09:18

我正在用Python(Vizard)在一台笔记本电脑上远程启动一个虚拟现实环境。之所以要远程操作,是因为笔记本电脑是关着的,用户把它放在背包里,同时还戴着头戴显示器。我可以打开网络连接并发送指令,让虚拟现实环境在笔记本上加载,但我却无法在不完全关闭Vizard的情况下关闭这个环境。

为了启动,我添加一个网络,像这样:

myNetwork = viz.addNetwork('computer_name')

然后我通过网络事件回调等待网络消息:

def onNetwork(e):
    loadWorld(e.preferences)

viz.callback(viz.NETWORK_EVENT, onNetwork)

def loadWorld(preferences):
    <<...>>

这样做效果很好,可以根据preferences中指定的设置把玩家引导到虚拟现实环境中。但是如果我再通过网络发送一条消息,新的世界就会叠加在旧的世界上,而且似乎没有什么好的方法可以优雅地关闭虚拟现实环境。

因为我无法以合适的方式拆解虚拟现实环境,所以从头重新启动整个程序似乎更好。Vizard中有一个命令viz.quit(),但如果我在loadWorld函数调用之前插入这个命令,程序就会完全停止运行,根本无法到达loadWorld。所以,我在想有没有其他方法可以做到这一点:让程序关闭,但整个脚本在一个循环中运行,这样当程序关闭时,它会立即重新启动。

我的问题是:如何让一个Python脚本关闭并释放所有资源,然后立即重新启动自己?

2 个回答

0

上面的回答没有关闭打开的文件对象和描述符,具体可以参考os.execv()。所以在执行os.execv()之前,应该先进行清理。根据Python的文档,你可以使用sys.stdout.flush()或者os.fsync()来刷新打开的文件对象和描述符。

1

我不太清楚vizard是什么,但如果你只是想重新启动一个脚本,这里有一种方法可以做到。

import os, sys

#stuff

def restart():
    args = sys.argv[:]  # get shallow copy of running script args
    args.insert(0, sys.executable)  # give it the executable
    os.execv(sys.executable, args)  # execute the script with current args, effectively relaunching it, can modify args above to change how it relaunches

调用 restart() 这个函数会用相同的参数重新启动脚本。

我可以确认,这种方法在普通的python脚本中有效,只要它在*nix环境下有执行权限,并且开头有一个shebang(就是指明脚本解释器的那一行),希望这能帮到你解决vizard的问题。

撰写回答