Of course! Using Python to control VirtualBox is a powerful and common task for automation, testing, and managing virtual infrastructure. There are two primary ways to do this:

- Using the
pyvboxLibrary (Recommended for most users): A Python wrapper that is easy to install and use. It's the most "Pythonic" way to interact with VirtualBox. - Using the
vboxweb-serviceandwebserviceAPI (Advanced): Directly communicating with the VirtualBox web service. This is more complex but gives you the most power and flexibility, including remote management.
Let's break down both methods.
Method 1: Using the pyvbox Library (Recommended)
pyvbox is a high-level library that provides a clean object-oriented interface to the VirtualBox Manager API. It simplifies the process immensely.
Installation
First, you need to ensure the VirtualBox Command-Line Interface (VBoxManage) is installed and accessible in your system's PATH. pyvbox acts as a wrapper for this tool.
- Windows: It's installed with VirtualBox. Add it to your PATH if it's not already.
- macOS: It's installed with VirtualBox. You can find it in
/Applications/VirtualBox.app/Contents/MacOS/. - Linux: You may need to install it separately. For example, on Debian/Ubuntu:
sudo apt-get install virtualbox
Next, install the pyvbox library using pip:

pip install pyvbox
Basic Examples
Here’s how you can perform common tasks with pyvbox.
Example 1: List All Virtual Machines
This script will connect to VirtualBox and print the name and state of every registered VM.
import virtualbox
# Get the VirtualBox manager instance
vbox = virtualbox.VirtualBox()
print("Available Virtual Machines:")
print("-" * 30)
for vm in vbox.machines:
# vm is a Machine object. We can access its attributes.
print(f"Name: {vm.name}")
print(f" State: {vm.state}")
print(f" OS Type: {vm.ostype}")
print("-" * 30)
Example 2: Start a Virtual Machine (Headless Mode)
This script will start a specific VM without opening the VirtualBox GUI (perfect for servers or automation).
import virtualbox
import time
vbox = virtualbox.VirtualBox()
vm_name = "MyUbuntuVM" # <-- CHANGE THIS to your VM's name
try:
vm = vbox.find_machine(vm_name)
print(f"Found VM: {vm.name}. Starting...")
# Launch the VM in headless mode (no GUI)
session = virtualbox.Session()
vm.launch_vm_process(session, "headless", "")
print("VM is starting...")
# You can add a loop here to check the state
while vm.state != virtualbox.library.MachineState.running:
print(f"Current state: {vm.state}")
time.sleep(2)
print(f"VM '{vm_name}' is now running.")
except virtualbox.library.InvalidObjectID:
print(f"Error: Virtual Machine with name '{vm_name}' not found.")
except Exception as e:
print(f"An error occurred: {e}")
Example 3: Power Off a VM
This script will find a running VM and shut it down gracefully.

import virtualbox
vbox = virtualbox.VirtualBox()
vm_name = "MyUbuntuVM" # <-- CHANGE THIS
try:
vm = vbox.find_machine(vm_name)
print(f"Found VM: {vm.name}. Current state: {vm.state}")
if vm.state == virtualbox.library.MachineState.running:
print("Attempting to power off...")
# We need a session to control the VM
session = virtualbox.Session()
# Lock the VM for control
vm.lock_machine(session, virtualbox.library.LockType.shared)
# Get the console object to power down
console = session.console
console.power_down()
print("VM is powering off...")
# Wait for it to shut down
while vm.state != virtualbox.library.MachineState.powered_off:
print(f"Current state: {vm.state}")
# Note: pyvbox might not update the state immediately.
# A small sleep can be helpful.
print(f"VM '{vm_name}' is now powered off.")
else:
print(f"VM is not running, it's in state: {vm.state}")
except virtualbox.library.InvalidObjectID:
print(f"Error: Virtual Machine with name '{vm_name}' not found.")
except Exception as e:
print(f"An error occurred: {e}")
Method 2: Using the vboxweb-service (Web Service API)
This method is more complex but more powerful. It involves starting a web service within VirtualBox that exposes a SOAP API. Your Python script can then make direct API calls to this service.
Setup
-
Start the Web Service: You need to start the
vboxweb-serviceprocess. The easiest way is to useVBoxManage.- Windows (Command Prompt as Administrator):
VBoxManage service vboxweb --start
- Linux/macOS (Terminal):
VBoxManage service vboxweb --start
This service will typically run on
http://localhost:18083.
- Windows (Command Prompt as Administrator):
-
Install Python SOAP Client: We'll use the
zeeplibrary, which is excellent for working with SOAP services.pip install zeep
Basic Example
This example will connect to the web service and list all VM names.
from zeep import Client
import logging
# Disable zeep's verbose logging for cleaner output
logging.basicConfig(level=logging.WARNING)
zeep_logger = logging.getLogger('zeep')
zeep_logger.setLevel(logging.WARNING)
try:
# Connect to the VirtualBox web service
# The URL points to the service's WSDL (Web Services Description Language)
client = Client('http://localhost:18083/')
# The service object is the root of the API
web_service = client.service
print("Available Virtual Machines (via Web Service):")
print("-" * 30)
# The 'IVirtualBox' interface has a 'machines' property
# which returns a list of IMachine objects
machines = web_service.IVirtualBox_machines
for machine in machines.Machine:
# Each machine object has attributes like 'name'
print(f"Name: {machine.name}")
print(f" State: {machine.state}")
print("-" * 30)
except Exception as e:
print(f"Could not connect to the VirtualBox web service.")
print("Please ensure 'vboxweb-service' is running.")
print(f"Error details: {e}")
Why choose this method?
- Remote Management: You can point the
Clientto a different machine's IP address (e.g.,http://192.168.1.100:18083/) to manage a VirtualBox installation on a remote server. - Full API Access: You get access to the entire VirtualBox API, which is more extensive than what
pyvboxexposes directly. - Language Agnostic: The API can be used from any language that can make SOAP calls (Java, C#, etc.).
Comparison: pyvbox vs. vboxweb-service
| Feature | pyvbox (Recommended) |
vboxweb-service (Advanced) |
|---|---|---|
| Ease of Use | Very High. Simple Pythonic syntax. | Low. Requires understanding SOAP and a complex API. |
| Setup | Minimal. Just install the library. | Requires starting a separate service (vboxweb-service). |
| Remote Use | Not directly possible. Requires SSH tunneling or similar. | Yes, natively. Just change the client URL. |
| API Coverage | Good. Covers most common tasks. | Complete. Access to the full, official VirtualBox API. |
| Dependencies | pip, VBoxManage in PATH. |
pip, zeep, vboxweb-service running. |
| Best For | Local scripts, beginners, automation, testing. | CI/CD pipelines, remote server management, complex integrations. |
Final Recommendation
- For most users and scripts, start with
pyvbox. It's much faster to get started with and handles the complexity of callingVBoxManagefor you. - If you need to manage VirtualBox on a remote machine or your automation requires a specific, low-level API call that
pyvboxdoesn't support, then invest the time to learn thevboxweb-servicemethod.
