Python sous-processus.Popen.wait() renvoie 0, même si une erreur s'est produite
Je suis en cours d'exécution d'un utilitaire de ligne de commande via Python sous-processus module. J'ai créer un sous-processus.Popen() de l'objet avec les arguments de ligne de commande et stdout=sous-processus.PIPE puis-je utiliser des sous-processus.wait() pour attendre jusqu'à ce que la tâche est à compléter et à retourner le code de retour qui devrait indiquer si la tâche est terminée avec succès.
translate = subprocess.Popen(['gdal_translate', '-of', 'HFA', 'inDataset', 'outDataset'], stdout=subprocess.PIPE)
if translate.wait() == 0: print "Success"
else: print "Fail - %s" % translate.stdout.read()
Si je lance mon script dans l'invite de commande windows, je peux voir les messages fournis par gdal_translate et ils disent qu'il y avait des erreurs qui entraînent l'échec du processus, mais mon script affiche toujours "Succès".
Comment puis-je vérifier pour les erreurs signalées par l'utilitaire de ligne de commande si le code de retour est toujours 0?
Comment puis-je voir le code de sortie dans le terminal? Ceci est un exemple d'un message d'erreur que j'ai reçu:
ERROR 1: path\to\dataset, band 1: IReadBlock failed at X offset 100, Y offset 331
Sur Windows?
echo %errorlevel%
, Je pense. En bash, il serait echo $?
.OriginalL'auteur Brian | 2012-12-20
Vous devez vous connecter pour publier un commentaire.
Il est possible que vous obtenez des erreurs en cours de sortie et ont toujours un code de retour égal à zéro. Dans votre code, vous ne capturer standard et non standard d'erreur. Dans la fonction run ci-dessous, il sera exécuté une commande, attente d'exécution à la fin, alors lisez la code_retour erreur standard et la sortie standard. Si il n'y a rien d'erreur standard ou si code_retour n'est pas à zéro, alors il va la traiter comme un échec. Vous pouvez voir les quatre exemples d'appels dans le code. La première est une réaction normale de l'aboutissement de l'appel, la deuxième est le code retour 0 mais a la sortie d'erreur et la sortie standard. La troisième a un retour non nul de code d'erreur et la sortie, alors que le dernier exemple a aucun zéro code de retour avec pas de sortie à tous.
code
sortie
subprocess.communicate
à la place: docs.python.org/2/library/...J'ai mis à jour la réponse à l'utilisation de communiquer, merci pour le commentaire.
OriginalL'auteur Marwan Alsabbagh