> ## Documentation Index
> Fetch the complete documentation index at: https://wb-21fd5541-dbrian-docs-serverless-training-quickstart.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Exécuter des commandes dans un sandbox

> Découvrez comment exécuter des commandes dans un sandbox, puis lire la sortie et les codes de sortie.

<Warning>
  Serverless Sandboxes est en préversion publique.
</Warning>

<br />

[Exécutez des commandes dans un sandbox](#run-commands-in-a-sandbox), [lisez la sortie des commandes et les codes de sortie](#read-output-and-exit-codes), et [vérifiez les erreurs](#check-for-sandbox-execution-errors). Utilisez ces fonctionnalités pour exécuter des scripts, des tâches d'entraînement et d'autres processus dans un W\&B Serverless Sandbox, puis vérifier les résultats par programmation.

<div id="run-commands-in-a-sandbox">
  ## Exécuter des commandes dans un sandbox
</div>

Le client sandbox prend en charge deux approches pour exécuter des commandes, selon que vous devez exécuter une commande unique ou une séquence de commandes liées. Selon votre cas d’usage, utilisez l’une de ces approches pour exécuter des commandes dans un sandbox :

* [Commande unique](#run-a-single-command) : transmettez la commande à `Sandbox.run()` et appelez `Sandbox.wait_until_complete()` pour attendre la fin de l’exécution. Idéal pour les traitements par lot, les tests ou les entraînements.
* [Commandes multiples](#run-multiple-commands-sequentially) : appelez `Sandbox.run()` sans argument, puis utilisez `Sandbox.exec()` pour chaque étape. Idéal pour les flux de travail qui combinent la configuration, l’exécution et la récupération des résultats.

<div id="run-a-single-command">
  ### Exécuter une seule commande
</div>

Passez la commande à `Sandbox.run()`, puis appelez `Sandbox.wait_until_complete()` pour attendre que le sandbox atteigne un état terminal.

L’exemple suivant démarre un sandbox qui exécute `python train.py`, puis attend au maximum 3 600 secondes que le sandbox se termine.

```python theme={null}
from wandb.sandbox import Sandbox

sandbox = Sandbox.run("python", "train.py")
sandbox.wait_until_complete(timeout=3600.0).result()
print(f"Exit code: {sandbox.returncode}")
```

<div id="run-multiple-commands-sequentially">
  ### Exécuter plusieurs commandes à la suite
</div>

Exécutez plusieurs commandes dans le même sandbox pour les flux de travail comportant plusieurs étapes. Par exemple, installez des dépendances, créez des fichiers, exécutez des scripts et lisez les résultats.

Pour exécuter plusieurs commandes dans un sandbox, démarrez le sandbox sans commande principale. Utilisez une série de `Sandbox.exec()` pour exécuter chaque commande et attendre qu’elle se termine.

L’exemple suivant démarre un sandbox sans commande principale, puis exécute deux commandes à la suite dans le même sandbox.

```python theme={null}
from wandb.sandbox import Sandbox

with Sandbox.run() as sandbox:
    result = sandbox.exec(["pip", "install", "torch"]).result()
    print(result.stdout)

    result = sandbox.exec(["python", "train.py"]).result()
    print(result.stdout)
```

`Sandbox.exec()` exécute une commande dans le sandbox et renvoie un objet `Process`. Utilisez l’objet renvoyé pour attendre la fin de l’exécution, lire la sortie et vérifier le code de sortie.

Pour plus d’informations sur `Sandbox.exec()` et ses paramètres, voir [`Sandbox.exec()`](https://docs.coreweave.com/products/coreweave-sandbox/client/ref/core/sandbox#exec) dans la documentation de référence de CoreWeave Sandboxes.

<div id="keep-the-sandbox-running-for-additional-commands">
  #### Maintenir le sandbox actif pour des commandes supplémentaires
</div>

Parfois, vous souhaiterez peut-être démarrer le sandbox avec un processus principal de longue durée afin de le maintenir disponible pendant l’exécution d’autres commandes avec `Sandbox.exec()`.

L’exemple suivant démarre un sandbox avec `sleep infinity` comme processus principal, puis exécute un script d’entraînement dans le sandbox avec `Sandbox.exec()`.

```python theme={null}
from wandb.sandbox import Sandbox

with Sandbox.run("sleep", "infinity") as sandbox:
    result = sandbox.exec(["python", "train.py"]).result()
    print(result.stdout)
```

<div id="read-output-and-exit-codes">
  ## Lire la sortie et les codes de sortie
</div>

Après avoir exécuté une commande, vous pouvez lire sa sortie et vérifier si elle a réussi. `Sandbox.exec()` renvoie un objet [`Process`](https://docs.coreweave.com/products/coreweave-sandbox/client/ref/types/process). Pour attendre la fin de la commande, appelez `Process.result()`.

Le résultat inclut la sortie standard (`stdout`), la sortie d'erreur standard (`stderr`) et le code de sortie (`returncode`).

Utilisez le code de sortie pour déterminer si la commande a réussi. Par convention, un code de sortie de 0 indique un succès. Les codes de sortie possibles et leur signification dépendent de la commande.

Par exemple, l'extrait de code suivant exécute une commande Python qui affiche la sortie standard (`stdout`) et le code de sortie (`returncode`). Une fois la commande terminée, l'extrait affiche la sortie standard, la sortie d'erreur standard et le code de sortie dans la console.

```python theme={null}
from wandb.sandbox import Sandbox

with Sandbox.run() as sandbox:
    result = sandbox.exec(["python", "-c", "print('hello')"]).result()
    print(result.stdout)      # "hello\\n"
    print(result.returncode)  # 0
```

<div id="check-for-sandbox-execution-errors">
  ## Vérifiez les erreurs d’exécution du sandbox
</div>

Utilisez `check=True` pour lever une exception lorsqu’une commande échoue, plutôt que d’inspecter manuellement les codes de sortie. Si la commande se termine avec un code de sortie non nul, `Sandbox.exec(check=True)` lève une [SandboxExecutionError](https://docs.coreweave.com/products/coreweave-sandbox/client/ref/exceptions/exceptions#sandboxexecutionerror).

```python theme={null}
from wandb.sandbox import Sandbox, SandboxExecutionError

with Sandbox.run() as sandbox:
    try:
        sandbox.exec(["python", "might_fail.py"], check=True).result()
    except SandboxExecutionError as e:
        print(f"La commande a échoué avec le code de sortie {e.exec_result.returncode}")
        print(e.exec_result.stderr)
```
