Незначительная модификация @ SvenMarnach код, который рассматривается вопрос о печати в стандартный выходной поток. Если вы используете функцию subprocess.check_output()
, а не subprocess.call()
, вы можете обрабатывать строку, которая обычно печатается стандартным образом в вашем коде, и по-прежнему захватывать исключения и код состояния выхода.
Если вы хотите, чтобы подавить стандартный поток вывода в терминале, не печатать зЬй из строки, возвращаемые из 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)
Ненулевой код состояния выхода и выход строки поднимаются в CalledProcessError
как subprocess.CalledProcessError.returncode
и subprocess.CalledProcessError.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)
print()
добавляет дополнительный символ новой строки к строке. Если вы хотите избавиться от этого (и писать зУю ошибку в станде ERR поток вместо станда из потока, как показаны с печатью() заявления выше), используйте sys.stdout.write(string)
и sys.stderr.write(string)
вместо печать():
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)
возможно дубликат [Тест, если исполняемый файл существует в Python?] (http://stackoverflow.com/questions/377017/test-if-executable-exists-in-python) –