Skip to main content

A Python USB/IP server for sharing USB devices over the network

Project description

usbipd-python

Downloads REUSE Compliant Lint

A USB/IP server written in Python 3 for sharing USB devices over the network. This implementation uses the pyusb library and the libusb backend to support cross-platform USB device access on macOS and Linux.

Note: This is an early-stage implementation, primarily created for learning purposes. Simple USB devices generally work well, but more complex or HID-based devices may experience issues. HID devices are managed by OS kernel drivers on macOS and Windows, making them difficult to detach without OS-native code or custom drivers. Contributions are welcome!

Installation

Users

Install from PyPI:

pip install usbipd-python
usbipd --help

Developers

  1. Clone the repository:

    git clone https://github.com/abrinkman/usbipd-python.git
    cd usbipd-python
    
  2. Create and activate a virtual environment:

    python3 -m venv .venv
    source .venv/bin/activate
    
  3. Install in development mode with dev dependencies:

    pip install -e ".[dev]"
    

System Requirements

  • Python: 3.9 or higher
  • libusb: Install using your system package manager
    • macOS: brew install libusb
    • Linux (Debian/Ubuntu): sudo apt-get install libusb-1.0-0-dev
    • Linux (Fedora/RHEL): sudo dnf install libusbx-devel

Usage

List USB Devices

Display all available USB devices:

usbipd list

Bind a Device

Bind a USB device by its bus ID to make it available for sharing:

usbipd bind --bus-id <bus-id>

Note that although you need to bind using the bus-id, in reality bindings are stored persistently using the device's VID:PID:serial. This means that even if the bus ID changes, devices are still recognized. Devices without a serial number are matched by VID:PID only.

Start the Server

For MacOS and perhaps other operating systems you will need to start the server with elevated privileges, as the underlying libusb library requires exclusive access to USB devices:

sudo usbipd start

Add -v or --verbose for debug output:

sudo usbipd -v start

If your user lacks permissions the application will warn you for this when attaching a device. Please note that these kind of issues can lead to undefined behavior, blue screens or kernel panics on either side. You have been warned!

Connect to the Server

Use a USB/IP client on another machine to connect and access shared devices.

Development

Code Quality

Run linting and formatting checks using ruff:

ruff check .          # Check for linting issues
ruff format --check . # Check code formatting
ruff format .         # Auto-format code

Run type checking:

mypy --ignore-missing-imports .

Project Structure

  • usbipd.py - Main CLI entry point
  • usb_device.py - USBDevice wrapper class for pyusb device access
  • usbip_server.py - USBIPServer class implementing the USB/IP protocol
  • binding_configuration.py - BindingConfiguration class for XML-based device binding storage
  • libusb_backend.py - Cross-platform libusb backend loader for pyusb

License

Licensed under GPL-3.0. See LICENSE for details.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

usbipd-0.0.7.tar.gz (47.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

usbipd-0.0.7-py3-none-any.whl (30.4 kB view details)

Uploaded Python 3

File details

Details for the file usbipd-0.0.7.tar.gz.

File metadata

  • Download URL: usbipd-0.0.7.tar.gz
  • Upload date:
  • Size: 47.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for usbipd-0.0.7.tar.gz
Algorithm Hash digest
SHA256 de762178e21e7e8e1a85807223b4d35d659b267ade8bcaad0e74e99bb17a19ff
MD5 c503ea9efe37c145f3c0dade746b461c
BLAKE2b-256 148186258ca7e6978335b5122e89d7b4d26e4829c9997960cd270ca78b5fb9f4

See more details on using hashes here.

Provenance

The following attestation bundles were made for usbipd-0.0.7.tar.gz:

Publisher: publish.yml on abrinkman/usbipd-python

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file usbipd-0.0.7-py3-none-any.whl.

File metadata

  • Download URL: usbipd-0.0.7-py3-none-any.whl
  • Upload date:
  • Size: 30.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for usbipd-0.0.7-py3-none-any.whl
Algorithm Hash digest
SHA256 c034aa9cefe1a03b4bccae0e0f2523e3c2bc4f6504788afc6712a0250d245eea
MD5 4c5a4ab23df8f37cb4fccd3ffbda4050
BLAKE2b-256 2a54ed9030509627c1b18cab2911ba77710daf8017069cdf7a7476937cd830b1

See more details on using hashes here.

Provenance

The following attestation bundles were made for usbipd-0.0.7-py3-none-any.whl:

Publisher: publish.yml on abrinkman/usbipd-python

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page