我正在使用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脚本关闭并释放所有资源,然后立即重新启动?
答案 0 :(得分: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()
将使用相同的args重新启动脚本。
我可以确认这适用于具有可执行权限的* nix环境中的普通旧python脚本,并且在它的头部有一个shebang,希望这有助于你的vizard问题
答案 1 :(得分:0)
上面的答案不会关闭打开的文件对象和描述符,请参阅os.execv(),因此在执行os.execv()
之前应该进行清理,如您可以使用的python文档中所述{ {1}}或sys.stdout.flush()
来刷新打开的文件对象和描述符。