<!-- SPDX-FileCopyrightText: Copyright 2022-2026 Jetperch LLC
SPDX-License-Identifier: Apache-2.0

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License. -->

<a id="jsdrv-py-api"></a>

# Python API

* [Driver](https://docs.joulescope.com/en/software/joulescope_driver/driver.md)
  * [`DeviceContext`](https://docs.joulescope.com/en/software/joulescope_driver/driver.md#pyjoulescope_driver.DeviceContext)
    * [`DeviceContext.close()`](https://docs.joulescope.com/en/software/joulescope_driver/driver.md#pyjoulescope_driver.DeviceContext.close)
    * [`DeviceContext.publish()`](https://docs.joulescope.com/en/software/joulescope_driver/driver.md#pyjoulescope_driver.DeviceContext.publish)
    * [`DeviceContext.publish_and_wait()`](https://docs.joulescope.com/en/software/joulescope_driver/driver.md#pyjoulescope_driver.DeviceContext.publish_and_wait)
    * [`DeviceContext.query()`](https://docs.joulescope.com/en/software/joulescope_driver/driver.md#pyjoulescope_driver.DeviceContext.query)
    * [`DeviceContext.subscribe()`](https://docs.joulescope.com/en/software/joulescope_driver/driver.md#pyjoulescope_driver.DeviceContext.subscribe)
    * [`DeviceContext.topic()`](https://docs.joulescope.com/en/software/joulescope_driver/driver.md#pyjoulescope_driver.DeviceContext.topic)
    * [`DeviceContext.unsubscribe()`](https://docs.joulescope.com/en/software/joulescope_driver/driver.md#pyjoulescope_driver.DeviceContext.unsubscribe)
  * [`Driver`](https://docs.joulescope.com/en/software/joulescope_driver/driver.md#pyjoulescope_driver.Driver)
    * [`Driver.close()`](https://docs.joulescope.com/en/software/joulescope_driver/driver.md#pyjoulescope_driver.Driver.close)
    * [`Driver.device_paths()`](https://docs.joulescope.com/en/software/joulescope_driver/driver.md#pyjoulescope_driver.Driver.device_paths)
    * [`Driver.device_watch()`](https://docs.joulescope.com/en/software/joulescope_driver/driver.md#pyjoulescope_driver.Driver.device_watch)
    * [`Driver.finalize()`](https://docs.joulescope.com/en/software/joulescope_driver/driver.md#pyjoulescope_driver.Driver.finalize)
    * [`Driver.find_devices()`](https://docs.joulescope.com/en/software/joulescope_driver/driver.md#pyjoulescope_driver.Driver.find_devices)
    * [`Driver.find_one_device()`](https://docs.joulescope.com/en/software/joulescope_driver/driver.md#pyjoulescope_driver.Driver.find_one_device)
    * [`Driver.is_driver_thread()`](https://docs.joulescope.com/en/software/joulescope_driver/driver.md#pyjoulescope_driver.Driver.is_driver_thread)
    * [`Driver.log_level`](https://docs.joulescope.com/en/software/joulescope_driver/driver.md#pyjoulescope_driver.Driver.log_level)
    * [`Driver.open()`](https://docs.joulescope.com/en/software/joulescope_driver/driver.md#pyjoulescope_driver.Driver.open)
    * [`Driver.publish()`](https://docs.joulescope.com/en/software/joulescope_driver/driver.md#pyjoulescope_driver.Driver.publish)
    * [`Driver.publish_and_wait()`](https://docs.joulescope.com/en/software/joulescope_driver/driver.md#pyjoulescope_driver.Driver.publish_and_wait)
    * [`Driver.query()`](https://docs.joulescope.com/en/software/joulescope_driver/driver.md#pyjoulescope_driver.Driver.query)
    * [`Driver.subscribe()`](https://docs.joulescope.com/en/software/joulescope_driver/driver.md#pyjoulescope_driver.Driver.subscribe)
    * [`Driver.unsubscribe()`](https://docs.joulescope.com/en/software/joulescope_driver/driver.md#pyjoulescope_driver.Driver.unsubscribe)
    * [`Driver.unsubscribe_all()`](https://docs.joulescope.com/en/software/joulescope_driver/driver.md#pyjoulescope_driver.Driver.unsubscribe_all)
  * [`ElementType`](https://docs.joulescope.com/en/software/joulescope_driver/driver.md#pyjoulescope_driver.ElementType)
  * [`ErrorCode`](https://docs.joulescope.com/en/software/joulescope_driver/driver.md#pyjoulescope_driver.ErrorCode)
  * [`Field`](https://docs.joulescope.com/en/software/joulescope_driver/driver.md#pyjoulescope_driver.Field)
  * [`LogLevel`](https://docs.joulescope.com/en/software/joulescope_driver/driver.md#pyjoulescope_driver.LogLevel)
  * [`MemClient`](https://docs.joulescope.com/en/software/joulescope_driver/driver.md#pyjoulescope_driver.MemClient)
    * [`MemClient.cmd()`](https://docs.joulescope.com/en/software/joulescope_driver/driver.md#pyjoulescope_driver.MemClient.cmd)
    * [`MemClient.erase_64k()`](https://docs.joulescope.com/en/software/joulescope_driver/driver.md#pyjoulescope_driver.MemClient.erase_64k)
    * [`MemClient.read()`](https://docs.joulescope.com/en/software/joulescope_driver/driver.md#pyjoulescope_driver.MemClient.read)
    * [`MemClient.read_personality()`](https://docs.joulescope.com/en/software/joulescope_driver/driver.md#pyjoulescope_driver.MemClient.read_personality)
    * [`MemClient.write_pages()`](https://docs.joulescope.com/en/software/joulescope_driver/driver.md#pyjoulescope_driver.MemClient.write_pages)
    * [`MemClient.write_verify()`](https://docs.joulescope.com/en/software/joulescope_driver/driver.md#pyjoulescope_driver.MemClient.write_verify)
    * [`MemClient.write_verify_records()`](https://docs.joulescope.com/en/software/joulescope_driver/driver.md#pyjoulescope_driver.MemClient.write_verify_records)
  * [`StdMsg`](https://docs.joulescope.com/en/software/joulescope_driver/driver.md#pyjoulescope_driver.StdMsg)
  * [`SubscribeContext`](https://docs.joulescope.com/en/software/joulescope_driver/driver.md#pyjoulescope_driver.SubscribeContext)
    * [`SubscribeContext.extend()`](https://docs.joulescope.com/en/software/joulescope_driver/driver.md#pyjoulescope_driver.SubscribeContext.extend)
    * [`SubscribeContext.unsubscribe()`](https://docs.joulescope.com/en/software/joulescope_driver/driver.md#pyjoulescope_driver.SubscribeContext.unsubscribe)
  * [`SubscribeFlags`](https://docs.joulescope.com/en/software/joulescope_driver/driver.md#pyjoulescope_driver.SubscribeFlags)
  * [`TimeMap`](https://docs.joulescope.com/en/software/joulescope_driver/driver.md#pyjoulescope_driver.TimeMap)
    * [`TimeMap.time_map_get()`](https://docs.joulescope.com/en/software/joulescope_driver/driver.md#pyjoulescope_driver.TimeMap.time_map_get)
* [Device selection](https://docs.joulescope.com/en/software/joulescope_driver/device_selection.md)
  * [`DevicePath`](https://docs.joulescope.com/en/software/joulescope_driver/device_selection.md#pyjoulescope_driver.device_path.DevicePath)
    * [`DevicePath.backend`](https://docs.joulescope.com/en/software/joulescope_driver/device_selection.md#pyjoulescope_driver.device_path.DevicePath.backend)
    * [`DevicePath.brand`](https://docs.joulescope.com/en/software/joulescope_driver/device_selection.md#pyjoulescope_driver.device_path.DevicePath.brand)
    * [`DevicePath.is_bootloader`](https://docs.joulescope.com/en/software/joulescope_driver/device_selection.md#pyjoulescope_driver.device_path.DevicePath.is_bootloader)
    * [`DevicePath.match()`](https://docs.joulescope.com/en/software/joulescope_driver/device_selection.md#pyjoulescope_driver.device_path.DevicePath.match)
    * [`DevicePath.model`](https://docs.joulescope.com/en/software/joulescope_driver/device_selection.md#pyjoulescope_driver.device_path.DevicePath.model)
    * [`DevicePath.serial_number`](https://docs.joulescope.com/en/software/joulescope_driver/device_selection.md#pyjoulescope_driver.device_path.DevicePath.serial_number)
  * [`BRANDS_TO_MODELS`](https://docs.joulescope.com/en/software/joulescope_driver/device_selection.md#pyjoulescope_driver.device_path.BRANDS_TO_MODELS)
  * [`BRAND_ALIASES`](https://docs.joulescope.com/en/software/joulescope_driver/device_selection.md#pyjoulescope_driver.device_path.BRAND_ALIASES)
  * [`brand_validate()`](https://docs.joulescope.com/en/software/joulescope_driver/device_selection.md#pyjoulescope_driver.device_path.brand_validate)
  * [`DeviceFilterError`](https://docs.joulescope.com/en/software/joulescope_driver/device_selection.md#pyjoulescope_driver.device_filter.DeviceFilterError)
  * [`find()`](https://docs.joulescope.com/en/software/joulescope_driver/device_selection.md#pyjoulescope_driver.device_filter.find)
  * [`find_one()`](https://docs.joulescope.com/en/software/joulescope_driver/device_selection.md#pyjoulescope_driver.device_filter.find_one)
* [Record](https://docs.joulescope.com/en/software/joulescope_driver/record.md)
* [Program](https://docs.joulescope.com/en/software/joulescope_driver/program.md)
  * [`release_program()`](https://docs.joulescope.com/en/software/joulescope_driver/program.md#pyjoulescope_driver.program.release_program)
  * [`program_js320()`](https://docs.joulescope.com/en/software/joulescope_driver/program.md#pyjoulescope_driver.program_js320.program_js320)
* [time64](https://docs.joulescope.com/en/software/joulescope_driver/time64.md)
  * [`as_datetime()`](https://docs.joulescope.com/en/software/joulescope_driver/time64.md#pyjoulescope_driver.time64.as_datetime)
  * [`as_isostr()`](https://docs.joulescope.com/en/software/joulescope_driver/time64.md#pyjoulescope_driver.time64.as_isostr)
  * [`as_time64()`](https://docs.joulescope.com/en/software/joulescope_driver/time64.md#pyjoulescope_driver.time64.as_time64)
  * [`as_timestamp()`](https://docs.joulescope.com/en/software/joulescope_driver/time64.md#pyjoulescope_driver.time64.as_timestamp)
  * [`duration_to_seconds()`](https://docs.joulescope.com/en/software/joulescope_driver/time64.md#pyjoulescope_driver.time64.duration_to_seconds)
  * [`filename()`](https://docs.joulescope.com/en/software/joulescope_driver/time64.md#pyjoulescope_driver.time64.filename)
  * [`now()`](https://docs.joulescope.com/en/software/joulescope_driver/time64.md#pyjoulescope_driver.time64.now)

## Command-line tools

The package installs command-line entry points.  For the full list:

```default
python -m pyjoulescope_driver --help
```

The commands that operate on devices select them with `--device` (`-d`),
which accepts the same device specifications as
`Driver.find_devices()`, such as `-d js320` or `-d 8W2A`.
The commands that support any device also accept `--brand`, such as
`--brand joulescope`.  For example:

```default
python -m pyjoulescope_driver info
python -m pyjoulescope_driver values -d js320
python -m pyjoulescope_driver metadata --brand joulescope
```
