Image

Imageodlbo wrote in Imageru_python

VirtualBox & Python

Всем доброго времени суток!

Перерыл весь интернет и доку по VirtualBox'у, но так и не нашёл толкового ответа на мой вопрос. Очень надеюсь, что кто-то сможет мне здесь помочь с ответом.


И так. Есть скрипт на Python, который использует библиотеку поставляющуюся с самим VirtualBox'ом. Скрипт должен делать 3-и вещи:
  1. остановить виртуальную машину;
  2. восстановить нужный образ;
  3. запустить виртуальную машину.
Я делаю примерно так (очень упрощённый, но вполне достаточный для воспроизведения проблемы пример кода):

#!/usr/bin/env python
from vboxapi import VirtualBoxManager
import time

UUID = '7efbec16-c985-4fef-b771-24b8611f544e'
SUUID = '071dfa5b-dbfd-4e16-846e-287f2fe7218e'

vboxmgr = VirtualBoxManager(None, None)

vbox = vboxmgr.vbox
mgr = vboxmgr.mgr

session = mgr.getSessionObject(vbox)
machine = vbox.findMachine(UUID)

#stop virtual machine;
machine.lockMachine(session, 1)
progress = session.console.powerDown()
while not progress.completed:
    progress.waitForCompletion(1000)

time.sleep(10) # if comment this line, script will raise the xpcom.Exception: 0x80bb0007 (The given session is busy)

#restore needed snapshot
machine.lockMachine(session, 1)
snapshot = machine.findSnapshot(SUUID)
progress = session.console.restoreSnapshot(snapshot)
while not progress.completed:
    progress.waitForCompletion(1000)
session.unlockMachine()

#start virtual machine
progress = machine.launchVMProcess(session,"gui", "")
while not progress.completed:
progress.waitForCompletion(1000)
vboxmgr.closeMachineSession(session)


В коде используется таймаут, без которого регулярно возникает искслючение "The given session is busy". Правда, порой и этого таймаута мало. Собственно вопрос такой: как сделать так, что бы работало стабильно и без всяких таймаутов. Сразу отмечу, делал опрос состояния сессии в цикле, но это не работает. Более мнее надёжно работает только код с таймаутом, но мне кажется, есть более достойное решение.

P.S.: использую VirtualBox версии 4.1.12_Ubuntu r77245