{"id":27283,"library":"pyjls","title":"pyjls","description":"Python library for reading and writing Joulescope™ file format (.jls). Version 0.17.0 supports Python 3.11+. Release cadence: approximately monthly.","status":"active","version":"0.17.0","language":"python","source_language":"en","source_url":"https://github.com/jetperch/jls","tags":["joulescope","file-format","data-acquisition","binary-format"],"install":[{"cmd":"pip install pyjls","lang":"bash","label":"Latest from PyPI"}],"dependencies":[{"reason":"Used for array operations in signal data.","package":"numpy","optional":false}],"imports":[{"note":"Direct import of module does not expose Reader; need explicit submodule import.","wrong":"import pyjls","symbol":"Reader","correct":"from pyjls import Reader"},{"note":"Writer is exposed at package level, not submodule.","wrong":"from pyjls.writer import Writer","symbol":"Writer","correct":"from pyjls import Writer"}],"quickstart":{"code":"from pyjls import Reader, Writer\nimport os\n\n# Write a simple JLS file\nfilename = 'example.jls'\nwriter = Writer(filename)\nsignal_id = writer.add_signal(\n    name='voltage',\n    units='V',\n    sample_type='f32',\n    sample_rate=1000.0\n)\nwriter.append_samples(signal_id, [1.0, 2.0, 3.0], time=[0, 1000, 2000])\nwriter.close()\n\n# Read it back\nreader = Reader(filename)\nfor sample_id in reader.signal_ids:\n    print(f'Signal {sample_id}: {reader.signal_name(sample_id)}')\nreader.close()\n\nos.remove(filename)","lang":"python","description":"Minimal example: create a JLS file with one signal, write samples, read back signal info."},"warnings":[{"fix":"Upgrade Python to 3.11 or later.","message":"Dropped Python 3.10 support in v0.16.0; requires ~=3.11.","severity":"breaking","affected_versions":">=0.16.0"},{"fix":"Ensure your JLS files embed UTC timezone info if you rely on absolute timestamps.","message":"UTC time default changed: Reader now uses 2018-01-01T00:00:00.0000000Z when UTC not found.","severity":"deprecated","affected_versions":">=0.14.0"},{"fix":"Iterate over reader.signal_ids to get valid signal IDs.","message":"Signal IDs are not guaranteed to be consecutive integers; use reader.signal_ids instead of assuming range.","severity":"gotcha","affected_versions":"all"}],"env_vars":null,"last_verified":"2026-05-01T00:00:00.000Z","next_check":"2026-07-30T00:00:00.000Z","problems":[{"fix":"Run 'pip install pyjls'.","cause":"Package not installed.","error":"ModuleNotFoundError: No module named 'pyjls'"},{"fix":"Use 'from pyjls import Reader'.","cause":"Importing 'pyjls' directly instead of submodule.","error":"AttributeError: module 'pyjls' has no attribute 'Reader'"},{"fix":"Shorten the signal name.","cause":"Signal name exceeds 4096 bytes.","error":"RuntimeError: Only supports up to 4096 bytes per signal name"}],"ecosystem":"pypi","meta_description":null,"install_score":null,"install_tag":null,"quickstart_score":null,"quickstart_tag":null}