Une légère modification du code de @SvenMarnach qui résout le problème de l'impression sur le flux de sortie standard. Si vous utilisez la fonction subprocess.check_output()
plutôt que la fonction subprocess.call()
vous pouvez alors traiter la chaîne qui est normalement imprimée en standard dans votre code et continuer à attraper les exceptions et le code d'état de sortie.
Si vous voulez supprimer le flux de sortie standard dans le terminal, n'imprimez pas la chaîne std out qui est retournée par la commande check_output
:
import subprocess
import os
try:
stdout_string = subprocess.check_output(["wget", "--help"], stderr=subprocess.STDOUT)
# print(stdout_string)
except subprocess.CalledProcessError as cpe:
print(cpe.returncode)
print(cpe.output)
except OSError as e:
if e.errno == os.errno.ENOENT:
print(e)
else:
# Something else went wrong while trying to run `wget`
print(e)
Le code d'état de sortie non nul et la chaîne de sortie sont affichés dans la fenêtre de l'utilisateur. CalledProcessError
comme subprocess.CalledProcessError.returncode
y subprocess.CalledProcessError.output
donc vous pouvez faire ce que vous voulez avec eux.
Si vous voulez imprimer la sortie standard de l'exécutable dans le terminal, imprimez la chaîne qui est retournée :
import subprocess
import os
try:
stdout_string = subprocess.check_output(["wget", "--help"], stderr=subprocess.STDOUT)
print(stdout_string)
except subprocess.CalledProcessError as cpe:
print(cpe.returncode)
print(cpe.output)
except OSError as e:
if e.errno == os.errno.ENOENT:
print(e)
else:
# Something else went wrong while trying to run `wget`
print(e)
print()
ajoute une nouvelle ligne à la chaîne. Si vous voulez éliminer cela (et écrire l'erreur std dans le flux std err au lieu du flux std out comme indiqué avec les instructions print() ci-dessus), utilisez sys.stdout.write(string)
y sys.stderr.write(string)
au lieu de print() :
import subprocess
import os
import sys
try:
stdout_string = subprocess.check_output(["bogus"], stderr=subprocess.STDOUT)
sys.stdout.write(stdout_string)
except subprocess.CalledProcessError as cpe:
sys.stderr.write(cpe.returncode)
sys.stderr.write(cpe.output)
except OSError as e:
if e.errno == os.errno.ENOENT:
sys.stderr.write(e.strerror)
else:
# Something else went wrong while trying to run `wget`
sys.stderr.write(e.strerror)