关闭Python脚本后立即重新启动
我正在用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 个回答
上面的回答没有关闭打开的文件对象和描述符,具体可以参考os.execv()。所以在执行os.execv()
之前,应该先进行清理。根据Python的文档,你可以使用sys.stdout.flush()
或者os.fsync()
来刷新打开的文件对象和描述符。
我不太清楚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的问题。