scripthelper
Helper module for simple command line Python scripts.
Basic usage
#!/usr/bin/env python3
import scripthelper
logger = scripthelper.bootstrap()
logger.critical("critical message")
logger.error("error message")
logger.warning("warning message")
logger.info("info message")
logger.verbose("verbose message")
logger.debug("debug message")
logger.spam("spam message")
It just works. Try --verbose and --quiet command line options, too.
It uses colored log messages on a terminal.
See --help for more information.
Adding other command line parameters
#!/usr/bin/env python3
import scripthelper
scripthelper.add_argument("-n", "--name", help="Name to greet")
logger, args = scripthelper.bootstrap_args()
if args.name:
logger.debug("Name was provided")
logger.info(f"Hello {args.name}")
else:
logger.warning("Name was not provided")
For bigger scripts it is good idea to have the logger at the very beginning, and encapsulate the argument parsing phase, which is typically in the main function:
#!/usr/bin/env python3
import scripthelper
logger = scripthelper.getLogger()
def greet(name):
logger.info(f"Hello {name}")
def main():
scripthelper.add_argument("--name", default="World")
args = scripthelper.initialize()
greet(args.name)
main()
Progressbar works with logging, too
#!/usr/bin/env python3
import scripthelper
import time
logger = scripthelper.bootstrap()
logger.info("Doing the calculations...")
for i in scripthelper.progressbar(range(100)):
if i % 20 == 0:
logger.verbose(f"Iteration {i}")
if i % 5 == 0:
logger.debug(f"Iteration {i}")
if logger.isEnabledFor(scripthelper.SPAM):
logger.spam(f"Iteration {i}")
time.sleep(0.01)
logger.info("Done")
It is automatically disabled on non-tty stderr by default.
Extended log levels can be used in modules
#!/usr/bin/env python3
import scripthelper
import example4module
scripthelper.bootstrap()
example4module.do_the_things()
#!/usr/bin/env python3
import scripthelper
logger = scripthelper.getLogger(__name__)
def do_the_things():
logger.verbose("Calling logger.verbose raises an exception if it does not work.")
logger.info("Hello from a module.")
You can easily preserve logs in files
#!/usr/bin/env python3
import scripthelper
logger = scripthelper.bootstrap()
scripthelper.setup_file_logging()
logger.critical("critical message")
logger.error("error message")
logger.warning("warning message")
logger.info("info message")
logger.verbose("verbose message")
logger.debug("debug message")
logger.spam("spam message")
It handles exceptions, warnings
#!/usr/bin/env python3
import scripthelper
scripthelper.bootstrap()
scripthelper.warn("This user warning will be captured.")
this_variable = "will be displayed in stack trace"
as_well_as = "the other variables"
raise RuntimeError("This exception should be handled.")
The local variables will be displayed in stack trace, for example:
WARNING example6.py:6: UserWarning: This user warning will be captured.
scripthelper.warn("This user warning will be captured.")
CRITICAL Uncaught RuntimeError: This exception should be handled.
File "example6.py", line 10, in <module>
6 scripthelper.warn("This user warning will be captured.")
7
8 this_variable = "will be displayed in stack trace"
9 as_well_as = "the other variables"
--> 10 raise RuntimeError("This exception should be handled.")
..................................................
this_variable = 'will be displayed in stack trace'
as_well_as = 'the other variables'
..................................................
Has built-in colored pretty printer
#!/usr/bin/env python3
import scripthelper
from dataclasses import dataclass
scripthelper.bootstrap()
@dataclass
class Item:
name: str
value: int
something = {
"string": "value1",
"bool": True,
"none": None,
"integer": 1234,
"item": Item("name", 999),
}
scripthelper.pp(something)
Has built-in persisted state handler
The state is persisted immediately in the background in YAML. Mutable objects (list, dict) also can be used.
#!/usr/bin/env python3
import scripthelper
logger = scripthelper.bootstrap()
state = scripthelper.PersistedState(processed_id=0, to_remember=[])
state.processed_id += 1
state.to_remember.append(f"Element {state.processed_id}")
while len(state.to_remember) > 2:
state.to_remember.pop(0)
logger.info(f"Processing item #{state.processed_id}")
for item in state.to_remember:
logger.info(f"- {item}")
$ python3 example9.py
INFO example9 Processing item #1
INFO example9 - Element 1
$ python3 example9.py
INFO example9 Processing item #2
INFO example9 - Element 1
INFO example9 - Element 2
$ python3 example9.py
INFO example9 Processing item #3
INFO example9 - Element 2
INFO example9 - Element 3
Helps issuing a warning only once
#!/usr/bin/env python3
import scripthelper
scripthelper.bootstrap()
for _ in range(10):
scripthelper.warning_once("Item #12 has some errors")
Metadata
Release files for scripthelper 25.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| scripthelper-25.1.tar.gz | 272.2 kB | Without provenance | Details for scripthelper-25.1.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| scripthelper-25.1-py3-none-any.whl | Python 3 | none | any | Details for scripthelper-25.1-py3-none-any.whl |
Total release size: 279.4 kB
Release files / scripthelper-25.1.tar.gz
| Download URL | scripthelper-25.1.tar.gz |
|---|---|
| Size | 272.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
b468ff097f41e1dc320d66834bc2d9bc2baea01fb877fdc4bd09b6845c2154e3
|
|
BLAKE2b-256 checksum How to use checksums |
310931d0eb5c33fbf66152171b7cb147af0ce2455756661f856891fa1fb2b722
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.8.12
|
Release files / scripthelper-25.1-py3-none-any.whl
| Download URL | scripthelper-25.1-py3-none-any.whl |
|---|---|
| Size | 7.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
69ca833a7c3fd35ad6c72e77a4240ac6eacb551d9ea6a658094f78bab7802d39
|
|
BLAKE2b-256 checksum How to use checksums |
265e99898e1c935cf3dcc7465ed2069a879b421fbd08e8c754466e688cdbbfa3
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.8.12
|
Security for scripthelper 25.1
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.