Skip to main content

Friendly misc/utils/convenience library

Version on pypi Tested with Github Actions Python versions tested (link to github project)

Overview

runez is a convenience "utils" library for common operations I found myself rewriting multiple times.

The name was initially meant as “run ez” (“run easy”), the fact that it sounds like “runes” gives it a bit of a mystery/magic side that’s also relatively appropriate (it does indeed concentrate a bit of invocation magic, as you can save quite a few lines of repetitive code by using it)

Features

  • Usable with any python version

  • Pure python standalone library, does not bring in any additional dependency

  • Takes care of most edge cases, with nice errors

    • Functions can be called without checking for return code etc (abort by default, with nice error)

    • They can also be called with fatal=False, in which case the return value will indicate whether call succeeded or not

  • Support for dryrun mode (show what would be done, but don’t do it)

  • Perform most typical logging setups in one call to runez.log.setup()

  • Log operations systematically (at debug level mostly), examples:

    Running: foo ...
    Copy foo -> bar
    Would move foo -> bar    (for dryrun)
  • CaptureOutput context manager -> grab output/logging from any code section

  • 100% test coverage

Example

Run a program:

import runez

# Aborts if "foo" doesn't exist
output = runez.run("ls", "foo")

# Output can also be ignored
runez.run("ls", "foo")

# Don't capture output, just run the command and let output "pass through"
runez.run("ls", "foo", stdout=None, stderr=None)

# Don't abort, return False on failure (or actual output when successful)
output = runez.run("ls", "foo", fatal=False)

File operations:

import runez

runez.touch("foo")
runez.copy("foo", "bar")
runez.move("foo", "baz")
runez.delete("foo")

runez.write("foo", "bar\nbaz\n")
content = "\n".join(runez.readlines("foo", first=10))

full_path = runez.resolved_path("foo/bar")
folder = runez.parent_folder(full_path)
runez.ensure_folder(folder)
with runez.Anchored(folder):
    assert runez.short(full_path) == "bar"

Installation

As usual, available on pypi: pip install runez

Philosophy

runez tries to provide a consistent interface across functions. Here are the main tenets for functions involving I/O (such as writing, reading, copy-ing files etc):

All IO-related functions NOT returning content (run(), delete(), …) have this common signature: fatal=True, logger=UNSET, dryrun=UNSET

  • fatal: decides whether operation should raise an exception on failure or not

    • fatal=True (default): raise an exception on failure, log a meaningful error

    • fatal=False: don’t raise on failure, log a meaningful error

    • fatal=None: don’t raise on failure, don’t log anything

    • In non-fatal mode, calls try to return a usable value appropriate for the call (see docstring of each function)

  • logger: decides how chatty the operation should be

    • LOG.error() is used for failures, except when fatal is not True AND provided logger is a callable

    • logger=UNSET (default):

      • LOG.debug("Running: ...") to trace activity

      • print("Would run: ...") in dryrun mode

    • logger=False: Log errors only (used internally, to avoid unnecessary log chatter when one operation calls another)

    • logger=mylogger: call provided mylogger() to trace activity (example: logger=MY_LOGGER.info)

      • mylogger("Running: ...") to trace activity

      • mylogger("Would run: ...") in dryrun mode

    • logger=None: Don’t log anything (even errors)

  • dryrun allows to override current runez.DRYRUN setting just for that call

All IO-related functions returning content (read_json(), readlines(), …) use a simpler convention based on: default=UNSET, which decides whether operation should raise an exception on failure or not:

  • When default is NOT provided, the function call will abort on failure with an exception, logging a meaningful error via LOG.error()

  • When default is provided (even if None), the function call will NOT abort, but return the specified default instead, it is up to the caller to log anything in that case (no log chatter comes from runez in that case, at all)

Metadata

Release files for runez 5.10.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for runez 5.10.1
File Size Uploaded
runez-5.10.1.tar.gz 163.9 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for runez 5.10.1
File Interpreter ABI Platform
runez-5.10.1-py3-none-any.whl Python 3 none any Details

Total release size: 284.7 kB

Release files / runez-5.10.1.tar.gz

Download URL runez-5.10.1.tar.gz
Size 163.9 kB
Tags Source
SHA-256 checksum
How to use checksums
45dbca0703d581003223f2de99b935711ef5448b898c8ca1e8458c8467cf3be4
BLAKE2b-256 checksum
How to use checksums
8310386f47d73b7bb4ff759b8318238a5e8f913c593f20c9fb0bec1dea89ae4a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 9, 2026.

Transparency log

Release files / runez-5.10.1-py3-none-any.whl

Download URL runez-5.10.1-py3-none-any.whl
Size 120.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
c066dc1a0e3ba418741b0fede80d02026f1a8bd685c1b655a13caf8a2bb68493
BLAKE2b-256 checksum
How to use checksums
cfad2dddd4084deba6d9f3c1e4e2e923a1562249d184da34272ed3104a4ca922
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 9, 2026.

Transparency log

Release history Release notifications | RSS feed

5.10.2

2 release files

This release

5.10.1 This release

2 release files

5.9.1

2 release files

5.9.0

2 release files

5.8.0

2 release files

5.7.1

2 release files

5.6.6

2 release files

5.6.5

2 release files

5.6.4

2 release files

5.6.3

2 release files

5.6.2

2 release files

5.6.1

2 release files

5.6.0

2 release files

5.5.0

2 release files

5.4.1

2 release files

5.4.0

2 release files

5.3.1

2 release files

5.3.0

2 release files

5.2.1

2 release files

5.2.0

2 release files

5.1.1

2 release files

5.1.0

2 release files

5.0.7

2 release files

5.0.6

2 release files

5.0.5

2 release files

5.0.4

2 release files

5.0.3

2 release files

5.0.2

2 release files

5.0.1

2 release files

5.0.0

2 release files

4.0.4

2 release files

4.0.3

2 release files

4.0.2

2 release files

4.0.1

2 release files

4.0.0

2 release files

3.7.1

2 release files

3.7.0

2 release files

3.6.8

2 release files

3.6.7

2 release files

3.6.6

2 release files

3.6.5

2 release files

3.6.4

2 release files

3.6.3

2 release files

3.6.2

2 release files

3.6.1

2 release files

3.6.0

2 release files

3.5.6

2 release files

3.5.5

2 release files

3.5.4

2 release files

3.5.3

2 release files

3.5.2

2 release files

3.5.1

2 release files

3.5.0

2 release files

3.4.9

2 release files

3.4.8

2 release files

3.4.7

2 release files

3.4.6

2 release files

3.4.5

2 release files

3.4.4

2 release files

3.4.3

2 release files

3.4.2

2 release files

3.4.1

2 release files

3.4.0

2 release files

3.3.7

2 release files

3.3.6

2 release files

3.3.5

2 release files

3.3.4

2 release files

3.3.3

2 release files

3.3.2

2 release files

3.3.1

2 release files

3.3.0

2 release files

3.2.4

2 release files

3.2.3

2 release files

3.2.2

2 release files

3.2.1

2 release files

3.2.0

2 release files

3.1.9

2 release files

3.1.8

2 release files

3.1.7

2 release files

3.1.6

2 release files

3.1.5

2 release files

3.1.4

2 release files

3.1.3

2 release files

3.1.2

2 release files

3.1.1

2 release files

3.1.0

2 release files

3.0.8

2 release files

3.0.7

2 release files

3.0.6

2 release files

3.0.5

2 release files

3.0.4

2 release files

3.0.3

2 release files

3.0.2

2 release files

3.0.1

2 release files

3.0.0

2 release files

2.7.16

2 release files

2.7.15

2 release files

2.7.14

2 release files

2.7.13

2 release files

2.7.12

2 release files

2.7.11

2 release files

2.7.10

2 release files

2.7.9

2 release files

2.7.8

2 release files

2.7.7

2 release files

2.7.6

2 release files

2.7.5

2 release files

2.7.4

2 release files

2.7.3

2 release files

2.7.2

2 release files

2.7.1

2 release files

2.7.0

2 release files

2.6.17

2 release files

2.6.16

2 release files

2.6.15

2 release files

2.6.14

2 release files

2.6.13

2 release files

2.6.12

2 release files

2.6.11

2 release files

2.6.10

2 release files

2.6.9

2 release files

2.6.8

2 release files

2.6.7

2 release files

2.6.6

2 release files

2.6.5

2 release files

2.6.4

2 release files

2.6.3

2 release files

2.6.2

2 release files

2.6.0

2 release files

2.5.9

2 release files

2.5.8

2 release files

2.5.7

2 release files

2.5.6

2 release files

2.5.5

2 release files

2.5.4

2 release files

2.5.3

2 release files

2.5.2

2 release files

2.5.1

2 release files

2.5.0

2 release files

2.4.11

2 release files

2.4.9

2 release files

2.4.8

2 release files

2.4.7

2 release files

2.4.6

2 release files

2.4.5

2 release files

2.4.4

2 release files

2.4.3

2 release files

2.4.2

2 release files

2.4.1

2 release files

2.4.0

2 release files

2.3.9

2 release files

2.3.8

2 release files

2.3.7

2 release files

2.3.6

2 release files

2.3.5

2 release files

2.3.4

2 release files

2.3.3

2 release files

2.3.2

2 release files

2.3.1

2 release files

2.3.0

2 release files

2.2.5

2 release files

2.2.4

2 release files

2.2.3

2 release files

2.2.2

2 release files

2.2.1

2 release files

2.2.0

2 release files

2.1.8

2 release files

2.1.7

2 release files

2.1.6

2 release files

2.1.5

2 release files

2.1.4

2 release files

2.1.3

2 release files

2.1.2

2 release files

2.1.1

2 release files

2.1.0

2 release files

2.0.17

2 release files

2.0.9

2 release files

2.0.6

2 release files

1.12.2

2 release files

1.11.5

2 release files

1.9.8

2 release files

1.9.6

2 release files

1.8.8

2 release files

1.5.5

2 release files

1.4.4

2 release files

1.3.6

2 release files

1.2.8

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page