Skip to main content
https://raw.githubusercontent.com/dbfixtures/mirakuru/master/logo.png

mirakuru

Mirakuru is a process orchestration tool designed for functional and integration tests.

When your application or tests rely on external processes (like databases, APIs, or other services), ensuring these processes are started and ready before your main code executes can be challenging. Mirakuru solves this by orchestrating the startup of these processes and waiting until they are fully operational (e.g., accepting connections, producing specific output) before allowing your program or tests to continue.

Latest PyPI version Wheel Status Supported Python Versions License

Installation

Install mirakuru using pip:

pip install mirakuru

Quick Start

Here’s a simple example showing how mirakuru ensures a Redis server is ready before your code runs:

from mirakuru import TCPExecutor

# Start Redis server and wait until it accepts connections on port 6379
redis_executor = TCPExecutor('redis-server', host='localhost', port=6379)
redis_executor.start()

# Redis is now running and ready to accept connections
# ... your code that uses Redis here ...

# Clean up - stop the Redis server
redis_executor.stop()

The key benefit: start() blocks until Redis is actually ready, so you never try to connect too early.

Usage

In projects that rely on multiple processes, there might be a need to guard code with tests that verify interprocess communication. You need to set up all the required databases, auxiliary and application services to verify their cooperation. Synchronizing (or orchestrating) test procedures with tested processes can be challenging.

If so, then mirakuru is what you need.

Mirakuru starts your process and waits for a clear indication that it’s running. The library provides seven executors to fit different cases:

Executor

Use When

SimpleExecutor

You just need to start/stop a process without waiting for readiness. Base class for all other executors.

Executor

Base class for executors that verify process startup.

OutputExecutor

Your process prints a specific message when ready (e.g., “Server started on port 8080”)

TCPExecutor

Your process opens a TCP port when ready (e.g., Redis, PostgreSQL, Memcached)

UnixSocketExecutor

Your process opens a Unix socket when ready (e.g., Docker daemon, some databases)

HTTPExecutor

Your process serves HTTP requests when ready (e.g., web servers, REST APIs)

PidExecutor

Your process creates a .pid file when ready (e.g., traditional Unix daemons)

SimpleExecutor

The simplest executor implementation. It simply starts the process passed to constructor, and reports it as running.

from mirakuru import SimpleExecutor

process = SimpleExecutor('my_special_process')
process.start()

# Here you can do your stuff, e.g. communicate with the started process

process.stop()

OutputExecutor

OutputExecutor starts a process and monitors its output for a specific text marker (banner). The process is not reported as started until this marker appears in the output.

from mirakuru import OutputExecutor

process = OutputExecutor('my_special_process', banner='processed!')
process.start()

# Here you can do your stuff, e.g. communicate with the started process

process.stop()

What happens during start here, is that the executor constantly checks output produced by started process, and looks for the banner part occurring within the output. Once the output is identified, as in example processed! is found in output. It is considered as started, and executor releases your script from wait to work.

TCPExecutor

TCPExecutor should be used to start processes that communicate over TCP connections. This executor tries to connect to the process on the specified host and port to check if it started accepting connections. Once it successfully connects, the process is reported as started and control returns to your code.

from mirakuru import TCPExecutor

process = TCPExecutor('my_special_process', host='localhost', port=1234)
process.start()

# Here you can do your stuff, e.g. communicate with the started process

process.stop()

HTTPExecutor

HTTPExecutor is designed for starting web applications and HTTP services. In addition to the command, you need to pass a URL that will be used to check if the service is ready. By default, it makes a HEAD request to this URL. Once the request succeeds, the executor reports the process as started and control returns to your code.

from mirakuru import HTTPExecutor

process = HTTPExecutor('my_special_process', url='http://localhost:6543/status')
process.start()

# Here you can do your stuff, e.g. communicate with the started process

process.stop()

This executor, however, apart from HEAD request, also inherits TCPExecutor, so it’ll try to connect to process over TCP first, to determine, if it can try to make a HEAD request already.

By default HTTPExecutor waits until its subprocess responds with 2XX HTTP status code. If you consider other codes as valid you need to specify them in ‘status’ argument.

from mirakuru import HTTPExecutor

process = HTTPExecutor('my_special_process', url='http://localhost:6543/status', status='(200|404)')
process.start()

The “status” argument can be a single code integer like 200, 404, 500 or a regular expression string - ‘^(2|4)00$’, ‘2dd’, ‘d{3}’, etc.

There’s also a possibility to change the request method used to perform request to the server. By default it’s HEAD, but GET, POST or other are also possible.

from mirakuru import HTTPExecutor

process = HTTPExecutor('my_special_process', url='http://localhost:6543/status', status='(200|404)', method='GET')
process.start()

PidExecutor

Is an executor that starts the given process, and then waits for a given file to be found before it gives back control. An example use for this class is writing integration tests for processes that notify their running by creating a .pid file.

from mirakuru import PidExecutor

process = PidExecutor('my_special_process', filename='/var/msp/my_special_process.pid')
process.start()

# Here you can do your stuff, e.g. communicate with the started process

process.stop()
from mirakuru import HTTPExecutor
from http.client import HTTPConnection, OK


def test_it_works():
    # The ``./http_server`` here launches some HTTP server on the 6543 port,
    # but naturally it is not immediate and takes a non-deterministic time:
    executor = HTTPExecutor("./http_server", url="http://127.0.0.1:6543/")

    # Start the server and wait for it to run (blocking):
    executor.start()
    # Here the server should be running!
    conn = HTTPConnection("127.0.0.1", 6543)
    conn.request("GET", "/")
    assert conn.getresponse().status is OK
    executor.stop()

A command by which executor spawns a process can be defined by either string or list.

# command as string
TCPExecutor('python -m smtpd -n -c DebuggingServer localhost:1025', host='localhost', port=1025)
# command as list
TCPExecutor(
    ['python', '-m', 'smtpd', '-n', '-c', 'DebuggingServer', 'localhost:1025'],
    host='localhost', port=1025
)

Use as a Context manager

Starting

Mirakuru executors can also work as a context managers.

from mirakuru import HTTPExecutor

with HTTPExecutor('my_special_process', url='http://localhost:6543/status') as process:

    # Here you can do your stuff, e.g. communicate with the started process
    assert process.running() is True

assert process.running() is False

Defined process starts upon entering context, and exit upon exiting it.

Stopping

Mirakuru also allows to stop process for given context. To do this, simply use built-in stopped context manager.

from mirakuru import HTTPExecutor

process = HTTPExecutor('my_special_process', url='http://localhost:6543/status').start()

# Here you can do your stuff, e.g. communicate with the started process

with process.stopped():

    # Here you will not be able to communicate with the process as it is killed here
    assert process.running() is False

assert process.running() is True

Defined process stops upon entering context, and starts upon exiting it.

Methods chaining

Mirakuru encourages methods chaining so you can inline some operations, e.g.:

from mirakuru import SimpleExecutor

command_stdout = SimpleExecutor('my_special_process').start().stop().output

Contributing and reporting bugs

Source code is available at: dbfixtures/mirakuru. Issue tracker is located at GitHub Issues. Projects PyPI page.

Windows support

Frankly, there’s none, Python’s support differs a bit in required places and the team has no experience in developing for Windows. However we’d welcome contributions that will allow the windows support.

See:

Also, with the introduction of WSL the need for raw Windows support might not be that urgent… If you’ve got any thoughts or are willing to contribute, please start with the issues listed above.

Release files for mirakuru 3.0.3

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

Source distribution (sdist)

Source distribution for mirakuru 3.0.3
File Size Uploaded
mirakuru-3.0.3.tar.gz 28.3 kB Details

Built distribution (wheel)

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

Total release size: 56.7 kB

Release files / mirakuru-3.0.3.tar.gz

Download URL mirakuru-3.0.3.tar.gz
Size 28.3 kB
Tags Source
SHA-256 checksum
How to use checksums
70ec0b03a474fd5c29ce2d2050e15546e91f4e7d5f709d209ad45d091deaa2f6
BLAKE2b-256 checksum
How to use checksums
8270d15022d73ed8c18977a8dc4860b3e1f83259fd8dddd8eaea0bb35c25afb9
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 Sep 3, 2026.

Transparency log

Release files / mirakuru-3.0.3-py3-none-any.whl

Download URL mirakuru-3.0.3-py3-none-any.whl
Size 28.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
a506fa39a401873b12c31fe902a40249e67f54e32351e42a77fd3e94a789f6f2
BLAKE2b-256 checksum
How to use checksums
413e4255fde6cd809861c677567513e767bda508a2d1264ec05d49258455ebb5
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 Sep 3, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

3.0.3 This release

2 release files

3.0.2

2 release files

3.0.1

2 release files

3.0.0

2 release files

2.6.1

2 release files

2.6.0

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.2

2 release files

2.4.1

2 release files

2.4.0

2 release files

2.3.1

2 release files

2.3.0

2 release files

2.2.0

2 release files

2.1.2

2 release files

2.1.1

2 release files

2.1.0

2 release files

2.0.2

2 release files

2.0.1

2 release files

1.1.0

2 release files

1.0.0

2 release files

0.9.0

2 release files

0.8.3

2 release files

0.8.2

2 release files

0.8.1

2 release files

0.8.0

2 release files

0.7.0

2 release files

0.6.1

2 release files

0.6.0

2 release files

0.5.0

2 release files

0.4.0

2 release files

0.3.0

2 release files

0.2.0

2 release files

0.1.4

2 release files

0.1.3

2 release files

0.1.2

2 release files

0.1.1

2 release files

0.1.0

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