Skip to main content
Ce guide explique comment exécuter des commandes dans des sandboxes à l’aide de la méthode exec(). Utilisez-la pour exécuter des commandes shell, des scripts ou des interpréteurs interactifs dans une sandbox lorsque vous souhaitez capturer leur sortie, la diffuser en temps réel, envoyer des données sur stdin ou contrôler la gestion des codes de sortie non nuls. Ce guide s’adresse aux développeurs qui utilisent déjà le client Python cwsandbox.

Choisir l’authentification

Ces exemples s’exécutent sur une capacité sans serveur, sauf si une section indique CKS. Choisissez l’identifiant d’authentification du compte propriétaire de vos Sandbox. Consultez Choisir et obtenir des identifiants d’authentification pour obtenir une clé ou un jeton. Exécutez les commandes d’installation dans un environnement virtuel Python actif. Enregistrez le code Python de l’onglet correspondant à votre identifiant d’authentification sous le nom sandbox_auth.py, dans le même répertoire que les scripts Python que vous exécutez depuis cette page. Ce fichier enregistre la méthode d’authentification choisie, et non votre identifiant d’authentification. Les exemples importent AUTH depuis ce fichier et le transmettent explicitement à chaque nouvelle Sandbox ou session.
Utilisez votre clé API Forge via la stratégie d’authentification W&B du SDK :
sandbox_auth.py
Pour un placement sur CKS, choisissez le jeton CoreWeave, activez un exécuteur et définissez placement_mode="cks" lors de la création de la Sandbox ou dans SandboxDefaults. Créer une session avec auth=AUTH authentifie également les Sandbox qui lui appartiennent. Utilisez le même identifiant d’authentification pour vous reconnecter aux Sandbox, les lister ou les nettoyer.

Exécuter une commande de base

Commencez par une commande unique qui s’exécute jusqu’à son achèvement et renvoie la sortie capturée. La méthode exec() renvoie un handle Process :

Obtenir les résultats

exec() rend la main immédiatement, ce qui vous permet de choisir comment attendre la fin de la commande. Appelez .result() sur le handle Process pour bloquer jusqu’à l’obtention de la sortie :

Sortie en flux

Un appel bloquant à .result() attend que la commande se termine avant d’afficher la moindre sortie. Pour suivre la progression en temps réel, itérez sur process.stdout avant d’appeler .result() :
Utilisez la diffusion en continu lorsque vous devez :
  • Surveiller des processus de longue durée.
  • Traiter la sortie au fur et à mesure qu’elle arrive.
  • Mettre en place des indicateurs de progression.

Transmettre une entrée en flux vers stdin

Certaines commandes ont besoin de recevoir une entrée sur stdin pendant leur exécution, comme les pipelines, les interpréteurs interactifs ou les outils qui lisent jusqu’à EOF. Pour envoyer une entrée à des commandes en cours d’exécution, activez stdin avec stdin=True :

Méthodes de StreamWriter

Lorsque stdin=True, process.stdin est un StreamWriter doté de trois méthodes :
  • write(data: bytes) : écrit des octets bruts. Renvoie OperationRef[None].
  • writeline(text: str) : écrit du texte suivi d’un saut de ligne (encodé en UTF-8). Renvoie OperationRef[None].
  • close() : signale la fin de fichier (EOF). Le système finalise d’abord les écritures en attente. Renvoie OperationRef[None].
Lorsque stdin=False (valeur par défaut), process.stdin vaut None.

Effectuer plusieurs écritures

Envoyez les données de manière incrémentielle avant de fermer le flux :

Exécuter du code Python en mode interactif via stdin

Transmettez du code Python à un interpréteur interactif :

Combiner la diffusion en continu sur stdin et stdout

Diffusez la sortie en continu tout en envoyant des entrées :

Gérer les commandes qui dépendent d’EOF

Certaines commandes (comme sort) lisent l’intégralité de l’entrée avant de produire une sortie. Fermez stdin pour signaler la fin de fichier (EOF) :

Utiliser stdin dans un contexte asynchrone

Dans un contexte asynchrone, utilisez Sandbox(...) afin que le gestionnaire de contexte asynchrone démarre la sandbox sans bloquer la boucle d’événements. Appliquez await à chaque OperationRef :

Quand utiliser stdin=True ou stdin=False

Définir le répertoire de travail

Par défaut, les commandes s’exécutent dans le répertoire de travail par défaut de la sandbox. Pour en utiliser un autre, remplacez-le avec cwd :
Le chemin doit être absolu.

Définir un délai d’expiration

Pour une commande plus longue exécutée en mode attaché, transmettez une valeur timeout_seconds explicite à exec(), par exemple 1800 pour un amorçage de 30 minutes. Consommez la sortie du processus à l’aide des méthodes décrites dans Sortie en flux. Par défaut, le délai d’expiration d’une requête exec est de 300 secondes. La durée de vie de la sandbox doit également couvrir toute la durée d’exécution de la commande. Un délai d’expiration exec plus long ne permet pas à la commande de survivre à une déconnexion du client. Pour arrêter une commande susceptible de se bloquer ou de s’exécuter plus longtemps que prévu, définissez un délai d’expiration avec timeout_seconds :

Gérer les erreurs avec check

Le paramètre check détermine le comportement à adopter lorsque le code de sortie est non nul :

Comportement par défaut avec check=False

Renvoie le résultat, quel que soit le code de sortie :

Lever une exception en cas d’échec avec check=True

Lève une exception SandboxExecutionError si le code de sortie est non nul :

Exécuter du code Python

Les bacs à sable servent couramment à exécuter du code Python, qu’il s’agisse de courtes commandes d’une seule ligne ou de scripts plus longs transmis directement en ligne :

Exécution séquentielle ou exécution parallèle

Choisissez l’exécution séquentielle lorsque des commandes dépendent de commandes précédentes, et l’exécution parallèle lorsque les commandes sont indépendantes et que vous souhaitez les exécuter simultanément sur plusieurs bacs à sable.

Exécuter les commandes séquentiellement lorsque l’ordre est important

Exécuter des commandes indépendantes en parallèle

Attendre la fin de N processus sur M

Utilisez cwsandbox.wait() pour attendre qu’un sous-ensemble de processus se termine :

Contrôler les processus

Lorsqu’une commande continue de s’exécuter une fois que l’appel exec() a rendu la main, vous pouvez vérifier son état sans bloquer, ou attendre qu’elle se termine au moment qui vous convient. Le handle Process fournit des méthodes de surveillance et de contrôle :
Dernière modification le 4 novembre 2026