Niewielkie modyfikacje kodu użytkownika @ SvenMarnach że rozwiązuje problem drukowania do standardowego strumienia wyjściowego. Jeśli użyjesz funkcji subprocess.check_output()
zamiast subprocess.call()
, będziesz w stanie obsłużyć normalnie wydrukowany ciąg standardowego kodu i nadal przechwytywać wyjątki i kod statusu wyjścia.
Jeśli chcesz stłumić standardowy strumień wyjściowy w terminalu, nie wydrukować std się ciąg znaków, który jest zwracany z 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)
niezerowy kod status wyjścia i ciąg wyjściowy są podnoszone w CalledProcessError
jako subprocess.CalledProcessError.returncode
i, dzięki czemu możesz robić, co chcesz z nimi.
Jeśli chcesz wydrukować standardowe wyjście wykonywalnego do terminala, drukowanie znaków, który jest zwracany:
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()
dodaje dodatkowy przełamane na ciąg. Jeśli chcesz, aby wyeliminować że (i pisać std błędu do strumienia std err zamiast std zewnątrz strumienia jak pokazano z print() oświadczenia powyżej), należy sys.stdout.write(string)
i sys.stderr.write(string)
zamiast 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)
możliwe duplikat [Test jeśli wykonywalny istnieje w języku Python?] (http://stackoverflow.com/questions/377017/test-if-executable-exists-in-python) –