|
1 | | -# I/O: Runner file handling |
| 1 | +# I/O: Runner File Handling |
2 | 2 |
|
3 | | -TODO: |
| 3 | +When you're using Styx wrapper functions with the default runners, you won't have to worry too much about I/O since a lot of it gets handled automatically for you. |
4 | 4 |
|
5 | | -- Explain output tuple, root attribute. |
| 5 | +## Basic File Access |
6 | 6 |
|
7 | | -## _Default_ runner behaviour |
| 7 | +Take this example: |
8 | 8 |
|
9 | | -While custom Styx runners allow users to implement file I/O handling any way they want, the 'default' runners (`LocalRunner` as well as `DockerRunner` and `SingularityRunner`) work very similarly by default. |
| 9 | +```python |
| 10 | +outputs = fsl.bet(infile="brain.nii", fractional_intensity=0.5) |
10 | 11 |
|
11 | | -They create a directory (default path `styx_temp/` in the current working directory) in which a folder gets created for every Styx function call. These will look like this: |
| 12 | +outputs.mask_file # File path to an individual output |
| 13 | +``` |
| 14 | + |
| 15 | +The `outputs` object gives you structured access to generated files through properties that support autocompletion and include helpful documentation. |
| 16 | + |
| 17 | +## Dynamic File Access |
| 18 | + |
| 19 | +Sometimes though, either when a descriptor hasn't been fully implemented or if the output structure is more complex, there may not be an output property available. For these cases, you can use the `outputs.root` property, which always points to the output directory: |
| 20 | + |
| 21 | +```python |
| 22 | +outputs.root / "my_special_file.ext" |
| 23 | + |
| 24 | +# Dynamic file access |
| 25 | +for number in [1, 2, 3]: |
| 26 | + f = outputs.root / f"my_file_with_a_{number}.ext" |
| 27 | +``` |
| 28 | + |
| 29 | +## Default Runner Behavior |
| 30 | + |
| 31 | +While custom Styx runners let you implement file I/O handling however you want, the default runners (`LocalRunner`, `DockerRunner`, and `SingularityRunner`) all work pretty similarly by default. They create a working directory (defaults to `styx_temp/` in your current working directory) with individual folders for each Styx function call you make. |
| 32 | + |
| 33 | +### Directory Structure |
12 | 34 |
|
13 | 35 | ``` |
14 | 36 | 79474bd248c4b2f1_5_bet/ |
15 | 37 | ^^^^^^^^^^^^^^^^ ^ ^^^ |
16 | 38 | | | | |
17 | | -| | `-- interface name (FSL BET) |
18 | | -| `---- number of execution (5th) |
19 | | -`--------------------- unique random hash |
| 39 | +| | `-- Interface name (FSL BET) |
| 40 | +| `---- Execution number (5th call) |
| 41 | +`--------------------- Unique session hash |
20 | 42 | ``` |
21 | 43 |
|
22 | | -Every time you create a new runner a new random hash will be generated. This ensures paths created are unique and avoid conflict with previous executions of your pipeline. The hash is followed by a counting number which chronologically will count up by one for every Styx function call. This makes the folder sortable. Lastly they contain the Styx function name to be human readable. |
| 44 | +**Components:** |
| 45 | +- **Session hash**: A unique random identifier generated per runner instance, preventing conflicts between pipeline executions |
| 46 | +- **Execution number**: Sequential counter for chronological ordering of function calls |
| 47 | +- **Interface name**: Human-readable identifier for the Styx function |
| 48 | + |
| 49 | +This naming convention ensures unique, sortable, and identifiable output directories. |
| 50 | + |
| 51 | +> [!WARNING] |
| 52 | +> You can clean up outputs using `shutil.rmtree(outputs.root)` for individual function outputs, or `shutil.rmtree(get_global_runner().data_dir)` to remove all outputs from the current session. **Be careful** - make sure you're not deleting any important data this way! |
| 53 | +
|
| 54 | +> [!NOTE] |
| 55 | +> For advanced runner configuration and custom I/O behavior, see [Subcommands](./runners.md) and [Writing Custom Runners](../advanced_concepts/custom_runners.md). |
0 commit comments