Skip to main content

Another async libusb wrapper.

Project description

asyncusb

The goal of this library is to be an efficient and pythonic asynchronous usb library written in pure python.

Here's an example that sends some data to a predetermined device endpoint.

import asyncio
from asyncusb.core import *

async def main():
    with Context() as ctx:
        devices = ctx.get_device_list()

        # Inspect device attributes and choose a device. We'll just take the
        # first device for the purposes of this example.
        dev = devices[0]

        async with dev.open() as handle:
            # Handle kernel drivers automatically.
            handle.set_auto_detach_kernel_driver(True)

            # Claim the interface for the duration of this with block. This
            # example assumes we're using interface 1.
            with handle.bind_interface(1):
                # Create and submit the transfer. This example assumes
                # we're just sending some data to endpoint 0x02.
                transfer = handle.fill_bulk_transfer(0x02, b'hello world!')
                transfer.submit()

                # Wait for transfer completion. If we don't, the dev.open()
                # context manager might cancel our transfer before it
                # finishes!
                await transfer.wait()

asyncio.run(main())

That's it! No manual resouce cleanup is required, as all cleanup is handled by the context managers.

Built-in Termux Compatibility

There are two built-in methods for accessing devices on Termux. The simplest method is using the termux_compatibility_hook method from the compat module, like so:

dev_path = "/dev/bus/usb/001/002"

# This function gets the device from Termux:API and sets the TERMUX_USB_FD
# environment variable for the Termux patch of libusb.
termux_compatibility_hook(dev_path)

# Then use the context as normal.
with Context() as ctx:
    devices = ctx.get_device_list()

    # ...

This only allows using one device per Context, however. For more advanced cases, termux_get_device and Context.wrap_sys_device can be used, in conjunction with the no_discovery context option, like so:

dev_path = "/dev/bus/usb/001/002"

# Get the system device handle (a file descriptor) from Termux:API.
sys_dev = termux_get_device(dev_path)

# Create a context with the 'no_discovery' option. This creates the context
# without searching for devices. This also means that ctx.get_device_list()
# will return an empty list.
with Context(no_discovery=True) as ctx:

    # Open the device.
    async with ctx.wrap_sys_device(sys_dev) as handle:

        # Get a Device instance, if needed.
        dev = handle.get_device()

        # ...

These methods aren't just limited to this library. termux_compatibility_hook will work for any library that uses libusb, and termux_get_device will work for any library that implements a way to call libusb_wrap_sys_device.

The compat module also provides other functions, such as is_termux(), has_termux_api(), and termux_list_devices().


Current Features:

  • async event handling
  • thread-safe transfer creation and submission
  • automated resource handling
  • Termux compatibility

Planned Features:

  • async endpoint read/write streams

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

asyncusb-0.1.0.tar.gz (42.2 kB view details)

Uploaded Source

Built Distribution

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

asyncusb-0.1.0-py3-none-any.whl (42.6 kB view details)

Uploaded Python 3

File details

Details for the file asyncusb-0.1.0.tar.gz.

File metadata

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

File hashes

Hashes for asyncusb-0.1.0.tar.gz
Algorithm Hash digest
SHA256 1ced124314bd4b8b7a756619267972b54aacd807700c9c0330a5a2e108b07fe6
MD5 40f07d2f1b5dcdc8364433a94bc50957
BLAKE2b-256 c4009be9b90bfa1222f7536d5fa631e45438a0ffb77ab6a36a262ffc8f020e82

See more details on using hashes here.

Provenance

The following attestation bundles were made for asyncusb-0.1.0.tar.gz:

Publisher: publish-to-pypi.yml on JacobTDC/asyncusb

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

File details

Details for the file asyncusb-0.1.0-py3-none-any.whl.

File metadata

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

File hashes

Hashes for asyncusb-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 afbeacfbaaf4ed5bfe56584bea8807aa26d5af08de07fa87c845f577aaa182e5
MD5 d6a31a5b8a2b3e13fc5f6498b941dc02
BLAKE2b-256 69f46c181927c19119745e57644681697811a9447afa070bd1e1e2470e174431

See more details on using hashes here.

Provenance

The following attestation bundles were made for asyncusb-0.1.0-py3-none-any.whl:

Publisher: publish-to-pypi.yml on JacobTDC/asyncusb

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