A Python USB/IP server for sharing USB devices over the network
Project description
usbipd-python
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
-
Clone the repository:
git clone https://github.com/abrinkman/usbipd-python.git cd usbipd-python
-
Create and activate a virtual environment:
python3 -m venv .venv source .venv/bin/activate
-
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
- macOS:
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 pointusb_device.py-USBDevicewrapper class forpyusbdevice accessusbip_server.py-USBIPServerclass implementing the USB/IP protocolbinding_configuration.py-BindingConfigurationclass for XML-based device binding storagelibusb_backend.py- Cross-platform libusb backend loader forpyusb
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
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
de762178e21e7e8e1a85807223b4d35d659b267ade8bcaad0e74e99bb17a19ff
|
|
| MD5 |
c503ea9efe37c145f3c0dade746b461c
|
|
| BLAKE2b-256 |
148186258ca7e6978335b5122e89d7b4d26e4829c9997960cd270ca78b5fb9f4
|
Provenance
The following attestation bundles were made for usbipd-0.0.7.tar.gz:
Publisher:
publish.yml on abrinkman/usbipd-python
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
usbipd-0.0.7.tar.gz -
Subject digest:
de762178e21e7e8e1a85807223b4d35d659b267ade8bcaad0e74e99bb17a19ff - Sigstore transparency entry: 752829807
- Sigstore integration time:
-
Permalink:
abrinkman/usbipd-python@5e298a0db684b9b02f14b0768e57e57b5f978928 -
Branch / Tag:
refs/tags/v0.0.7 - Owner: https://github.com/abrinkman
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@5e298a0db684b9b02f14b0768e57e57b5f978928 -
Trigger Event:
push
-
Statement type:
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c034aa9cefe1a03b4bccae0e0f2523e3c2bc4f6504788afc6712a0250d245eea
|
|
| MD5 |
4c5a4ab23df8f37cb4fccd3ffbda4050
|
|
| BLAKE2b-256 |
2a54ed9030509627c1b18cab2911ba77710daf8017069cdf7a7476937cd830b1
|
Provenance
The following attestation bundles were made for usbipd-0.0.7-py3-none-any.whl:
Publisher:
publish.yml on abrinkman/usbipd-python
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
usbipd-0.0.7-py3-none-any.whl -
Subject digest:
c034aa9cefe1a03b4bccae0e0f2523e3c2bc4f6504788afc6712a0250d245eea - Sigstore transparency entry: 752829810
- Sigstore integration time:
-
Permalink:
abrinkman/usbipd-python@5e298a0db684b9b02f14b0768e57e57b5f978928 -
Branch / Tag:
refs/tags/v0.0.7 - Owner: https://github.com/abrinkman
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@5e298a0db684b9b02f14b0768e57e57b5f978928 -
Trigger Event:
push
-
Statement type: