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 nomsandbox_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.
- Clé API Forge
- Jeton d’accès à l’API CoreWeave
Utilisez votre clé API Forge via la stratégie d’authentification W&B du SDK :
sandbox_auth.py
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éthodeexec() 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() :
- 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 avecstdin=True :
Méthodes de StreamWriter
Lorsquestdin=True, process.stdin est un StreamWriter doté de trois méthodes :
write(data: bytes): écrit des octets bruts. RenvoieOperationRef[None].writeline(text: str): écrit du texte suivi d’un saut de ligne (encodé en UTF-8). RenvoieOperationRef[None].close(): signale la fin de fichier (EOF). Le système finalise d’abord les écritures en attente. RenvoieOperationRef[None].
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 (commesort) 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, utilisezSandbox(...) 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 aveccwd :
Définir un délai d’expiration
Pour une commande plus longue exécutée en mode attaché, transmettez une valeurtimeout_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ètrecheck 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 exceptionSandboxExecutionError 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
Utilisezcwsandbox.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’appelexec() 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 :