Maison  >  Article  >  développement back-end  >  Le sous-processus renvoie un code de sortie différent de zéro : comment résoudre l'erreur du sous-processus de Python ?

Le sous-processus renvoie un code de sortie différent de zéro : comment résoudre l'erreur du sous-processus de Python ?

王林
王林original
2023-06-24 16:42:312062parcourir

En Python, le sous-processus est un outil très utile qui nous permet d'exécuter d'autres programmes ou commandes de manière asynchrone au sein du programme. Mais un problème peut survenir, c'est-à-dire que le processus enfant renvoie un code de sortie différent de zéro, ce qui signifie qu'il y a une erreur dans l'exécution du processus enfant. Cet article abordera ce problème et proposera quelques solutions.

  1. Sous-processus et code de sortie

Un sous-processus est un processus indépendant créé par le processus principal et exécuté en arrière-plan. Le processus principal peut interagir avec le processus enfant, par exemple en envoyant des commandes ou des données au processus enfant et en obtenant les résultats de sortie du processus enfant.

Le processus enfant renverra un code de sortie après avoir terminé la tâche. Dans des circonstances normales, le code de sortie doit être zéro, indiquant que le processus enfant s'est exécuté avec succès. Si le processus enfant rencontre une erreur, un code de sortie différent de zéro est renvoyé.

Lorsque nous utilisons des sous-processus en Python, nous utilisons généralement le module de sous-processus de Python. Ce module fournit diverses méthodes pour créer des sous-processus et peut surveiller la sortie et l'état d'exécution du sous-processus.

  1. Gestion des erreurs dans les processus enfants

Avant de gérer les erreurs dans les processus enfants, nous devons connaître le code de sortie et le message d'erreur renvoyés par le processus enfant. Pour ce faire, nous pouvons ajouter la ligne suivante au code Python :

import subprocess

p = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
output, error = p.communicate()

if p.returncode != 0:
    print("Error: Command failed with return code", p.returncode)
    print("Error message:", error.decode())

Dans le code ci-dessus, nous utilisons la méthode subprocess.Popen pour créer le sous-processus et utilisons les paramètres stdout et stderr pour spécifier les flux de sortie et d'erreur. Nous utilisons également le paramètre shell pour indiquer si la chaîne de commande doit être interprétée par le shell.

Lorsque le processus enfant est terminé, nous utilisons la méthode de communication de l'objet Popen pour obtenir la sortie et le message d'erreur, et vérifions l'attribut returncode de l'objet Popen pour déterminer si une erreur s'est produite. Si un code de sortie différent de zéro est renvoyé, le processus enfant a renvoyé une erreur et imprimé un message d'erreur.

  1. Résoudre les erreurs de processus enfant

Il existe plusieurs façons de résoudre les erreurs de processus enfant :

3.1. Vérifiez la commande

Tout d'abord, nous devons vérifier si la commande assignée au processus enfant est correcte. Cela peut paraître évident, mais dans les systèmes complexes, les dépendances entre les commandes peuvent être complexes, nous devrons donc peut-être revérifier la syntaxe et les paramètres de la chaîne de commande.

3.2. Vérifier les entrées et les sorties

Parfois, les erreurs renvoyées par un processus enfant peuvent être causées par des formats d'entrée ou de sortie incorrects. Si vous utilisez stdin pour saisir des données dans un sous-processus, assurez-vous que les données d'entrée sont au format correct et qu'aucune donnée importante n'est perdue dans la sortie du sous-processus.

3.3. Gestion des messages d'erreur

Bien que le module de sous-processus de Python puisse nous indiquer les messages d'erreur renvoyés par le sous-processus, nous devrons peut-être traiter davantage ces messages. Par exemple, nous pouvons enregistrer les messages d'erreur dans un fichier journal pour les vérifier ultérieurement.

3.4. Assurez-vous que l'environnement d'exécution de la commande est correct

Le processus enfant devra peut-être s'exécuter dans des variables et des chemins d'environnement spécifiques. Si vous modifiez ces variables d'environnement dans le programme principal, vous devez vous assurer qu'elles sont correctement définies dans le processus enfant pour garantir une exécution correcte.

3.5. Utilisez l'instruction try-sauf pour gérer les exceptions

Si votre code rencontre une exception lors de la gestion du processus enfant, vous pouvez utiliser l'instruction try-sauf pour intercepter l'exception et enregistrer le message d'erreur. Par exemple :

import subprocess

try:
    p = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
    output, error = p.communicate()

    if p.returncode != 0:
        raise subprocess.CalledProcessError(p.returncode, command, error)
except subprocess.CalledProcessError as e:
    print("Error: Command failed with return code", e.returncode)
    print("Error message:", e.output.decode())

Dans le code ci-dessus, nous utilisons l'instruction try-sauf pour intercepter les exceptions qui se produisent lors de l'appel du processus enfant. Si une exception se produit, nous déclenchons une nouvelle exception en utilisant subprocess.CalledProcessError et lui transmettons le code de retour et le message d'erreur.

  1. Résumé

Les sous-processus sont un outil puissant dans les programmes Python, mais les erreurs peuvent devenir délicates lorsque le sous-processus renvoie un code de sortie différent de zéro. Pour résoudre ce problème, nous devons vérifier la commande, l'entrée et la sortie, garantir le bon environnement d'exécution et gérer les messages d'erreur. Si nécessaire, nous pouvons également utiliser des instructions try-sauf pour intercepter les exceptions et enregistrer les messages d'erreur.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn