Install & Compatibility
Where this runs
tested against v1.14.2 · pip install
no network on importno background threads
Install × environment matrix
Each cell = how many times install + import succeeded across repeated harness runs. Partial = flaky.
glibc = Debian/Ubuntu slim · musl = Alpine Linux
muslpy 3.10–3.910 runs
installs and imports cleanly · install 0.0s · import 0.000s · 41.6MB
glibcpy 3.10–3.910 runs
installs and imports cleanly · install 4.6s · import 0.000s · 43MB
39MB installed
● package 39MB
Code
Verified usage
Verified import paths — ran on the pinned version, not inferred.
runner
✓ from WDL import runner
✗ from WDL import runner
This quickstart demonstrates how to programmatically run a simple WDL workflow using `miniwdl.runner.run`. It creates a temporary WDL file, defines inputs, executes the workflow, and prints the output.
import miniwdl.runner
import os
# Create a simple WDL file for demonstration
wdl_content = """
version 1.0
workflow hello {
input { String name }
call hello_task { input: name = name }
}
task hello_task {
input { String name }
command { echo "Hello, ${name}!" }
output { String message = read_string(stdout()) }
}
"""
with open("hello.wdl", "w") as f:
f.write(wdl_content)
# Define inputs as a dictionary
inputs = {"hello.name": "WDL User"}
# Run the WDL workflow
try:
run_result = miniwdl.runner.run(
wdl="hello.wdl",
inputs=inputs,
dir=os.getcwd() # Specify directory where WDL is found
)
# Access outputs
print(f"Workflow output: {run_result.outputs['hello.hello_task.message']}")
except Exception as e:
print(f"An error occurred: {e}")
finally:
# Clean up the dummy WDL file
if os.path.exists("hello.wdl"):
os.remove("hello.wdl")
miniwdl --version
Debug
Known issues
breakingImplicit coercions from optional types (e.g., `String?`) to non-optional types (`String`) were disallowed starting in v1.9.0.fixExplicitly cast optional values to their non-optional counterparts using `as String` or ensure the target variable is also optional. For example, `my_optional_string_var as String`.
affects: >=1.9.0
breakingThe default `-l` (login shell) flag for task command bash interpreters was removed in v1.9.0. This can change the environment available to your tasks.fixIf your tasks rely on login shell features (e.g., specific `~/.bashrc` settings), you can restore this behavior by configuring `[task_runtime] bash_cmd_shell_opts = ['-l']` in your miniwdl configuration file.
affects: >=1.9.0
gotchaWith Python 3.10+ and `asyncio`, you might encounter errors related to the event loop. v1.13.1 fixed an issue with `asyncio.get_event_loop()`.fixUpgrade to miniwdl v1.13.1 or newer to resolve `asyncio.get_event_loop()` related errors on modern Python versions.
affects: <1.13.1 on Python 3.10+
gotchav1.13.0 introduced changes for WDL 1.1 spec compliance, including dedenting task commands before interpolation and stricter type checking for struct literals. This could subtly alter behavior for existing WDLs.fixReview WDLs for reliance on specific command indentation or implicit field handling in structs. Update WDLs to conform strictly to WDL 1.1 specification and declare all struct fields explicitly.
affects: >=1.13.0
gotchaInternal migration from `pkg_resources` to `importlib_metadata` in v1.13.1. While this primarily affects miniwdl's internals, outdated `setuptools` in the user environment could cause issues.fixEnsure your `setuptools` package is up-to-date (`pip install --upgrade setuptools`) if you encounter any import or packaging-related errors.
affects: N/A (internal change)
Upgrade
Version history
1.14.2latest on PyPI · released Apr 26, 2026
Audit
Dependencies
pythonrequiredminiwdl requires Python 3.8 or newer.