vboxapiを使ってVirtualBoxをPythonから操作その1

対象: VirtualBox-3.1, Python-2.6

日常的にデスクトップ用途としてUbuntu 9.10を使っています。たまに他のOSを使う用事があって、そういうときにはVirtualBoxから使っています。

デスクトップOSとして使っているだけなのでVMの起動も終了もGUIからやってしまうのですが、プログラムからVirtualBoxの機能にアクセスできるAPIが用意されているので、何ができるのか調べてみました。
APIにはPythonC++用が用意されているのですが、Python用を使うことにします。

python-apiのありか

UbuntuではVirtualBoxをインストールすると以下の場所に勝手に入ります。

% dpkg -L virtualbox-3.1 | grep vboxapi
/usr/share/pyshared/vboxapi-1.0.egg-info
/usr/share/pyshared/vboxapi
/usr/share/pyshared/vboxapi/__init__.py
/usr/share/pyshared/vboxapi/VirtualBox_constants.py

debパッケージをインストールすれば、pythonからimport vboxapiだけで使用可能です。

APIドキュメント

VirtualBoxのダウンロードページの「VirtualBox 3.1.0 Software Developer Kit (SDK)」からSDKを入手してください。APIドキュメントはその中に同梱されています。なお、要ユーザ登録でした。
内容はdoxygenで生成したC++APIドキュメントです。Pythonから使う場合でも大いに参考になります。

サンプル1: VM一覧を表示する

VMを作成したユーザで実行する必要があります。

import vboxapi
vbm = vboxapi.VirtualBoxManager(None, None)
vbox = vbm.vbox
machines = vbm.getArray(vbox, 'machines')

for m in machines:
    print "----"
    print "id =", m.id
    print "name =", m.name
    print "state =", m.state
    print "vrdp =", m.VRDPServer.enabled
    print "vrdpPorts =", m.VRDPServer.ports

結果です。一部伏せ字。

----
id = e050****-****...
name = Win****
state = 1
vrdp = True
vrdpPorts = 3389
----
id = 4f2f****-****...
name = w****
state = 1
vrdp = True
vrdpPorts = 3390
----
id = e63b****-****...
name = *****
state = 1
vrdp = True
vrdpPorts = 3391

とっても簡単ですね。

注意

VirtualBox-3.0でこの調査をしている途中にVirtualBox-3.1がリリースされたのですが、一部のAPIに変更が加えられていました。
上記の例でも、3.0 では"VRDPServer.port"だったものが、3.1では"VRDPServer.ports"になったりしています。

今後の予定

apiからVMを操作する