3

我正在使用 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 脚本关闭并释放所有资源,然后立即重新启动自己?

4

2 回答 2

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()将使用相同的参数重新启动脚本。

我可以确认这适用于 *nix 环境中的普通旧 python 脚本,它具有可执行权限和一个 shebang,希望这有助于解决你的 vizard 问题

于 2014-06-10T15:58:52.633 回答
0

上面的答案不会关闭打开的文件对象和描述符,请参阅os.execv(),因此应在执行之前进行清理os.execv(),如您可以使用sys.stdout.flush()os.fsync()刷新打开的文件对象和描述符的 python 文档中所述。

于 2015-10-25T00:30:55.843 回答