2010-02-22 127 views
0

我们使用python virtualbox API来控制virtualbox。为此,我们使用“pyvb”包(如python API文档中给出的那样)。使用python控制命令行的VirtualBox

al=pyvb.vb.VB() 
m=pyvb.vm.vbVM() 
al.startVM(m) 

我们已经使用Python解释器执行。没有显示错误,但virtualbox不启动。你能告诉我们什么可能是错的(所有必要的模块和包已被导入)

回答

0

引用的代码似乎并没有指定要运行的虚拟机。你不应该做一个getVM调用,然后在你的startVM调用中使用结果VM实例吗?例如: -

al=pyvb.vb.VB() 
m=al.getVM(guid_of_vm) 
al.startVM(m) 

...将开始与给定GUID标识的VM(所有的VirtualBox虚拟机都在创建时一个GUID分配)。您可以从VM的XML文件中获取GUID。如果你需要在运行时发现虚拟机,有得心应手listVMS电话:

al=pyvb.vb.VB() 
l=al.listVMS() 
# choose a VM from the list, assign to 'm' 
al.startVM(m) 
+0

我们尝试过,但得到了一些错误,如: 回溯(最近通话最后一个): 文件 “”,一号线, 文件“/usr/lib/python2.5/site -packages/pyvb-0.0.2-py2.5.egg/pyvb/vb.py“,第65行,启动虚拟机 cmd ='%s%s'%(VB_COMMAND_STARTVM,vm.getUUID()) AttributeError:' NoneType'对象没有'getUUID'属性。 请帮助我们。 – ask 2010-02-22 18:47:17

+0

感谢您的快速回复 但我们实际需要的是使用python virtualbox API执行这些命令。 – ask 2010-02-22 19:09:19

+0

@ask:对不起,我认为VirtualBox支持在其命令行工具中使用名称而不是GUID,但python lib也是如此,但'getVM'方法表示它需要一个GUID。布莱什。为此更新了答案,并提请注意'listVMS'方法。 – 2010-02-23 05:00:07

3

我发现我可以使用下面的函数找到,如果一个虚拟机运行,恢复虚拟机到特定的快照,并启动虚拟机的名称。

from subprocess import Popen, PIPE 

    def running_vms(): 
     """ 
     Return list of running vms 
     """ 
     f = Popen(r'vboxmanage --nologo list runningvms', stdout=PIPE).stdout 
     data = [ eachLine.strip() for eachLine in f ] 
     return data 

    def restore_vm(name='', snapshot=''): 
     """ 
     Restore VM to specific snapshot uuid 

     name = VM Name 
     snapshot = uuid of snapshot (uuid can be found in the xml file of your machines folder) 
     """ 
     command = r'vboxmanage --nologo snapshot %s restore %s' % (name,snapshot) 
     f = Popen(command, stdout=PIPE).stdout 
     data = [ eachLine.strip() for eachLine in f ] 
     return data 

    def launch_vm(name=''): 
     """ 
     Launch VM 

     name = VM Name 
     """ 
     command = r'vboxmanage --nologo startvm %s ' % name 
     f = Popen(command, stdout=PIPE).stdout 
     data = [ eachLine.strip() for eachLine in f ] 
     return data