В Python 2 или 3, как получить код возврата и строку возврата системного вызова?

Я знаю, что могу сделать это, чтобы получить команду на выполнение системной команды, например, make, и это даст мне либо 0 для успеха, либо ненулевое значение для ошибки.

import os
result = os.system('make')

Я также знаю, что могу сделать это, чтобы увидеть возвращаемую строку команды

import commands
result = commands.getoutput('make')

Как я могу выполнить и то и другое, где я получаю и код возврата, и результат строки возврата, так что тогда я могу

if return_code > 0:
  print(return_string)

Спасибо.

4 голоса | спросил Chris F 3 52017vEurope/Moscow11bEurope/MoscowFri, 03 Nov 2017 23:15:17 +0300 2017, 23:15:17

2 ответа


0

Канонический способ запуска чего-либо с Python - это использование модуля subprocess, но у него есть множество загадочных функций, называемых ---- +: = 1 =: + ---- или check_call, и эти функции, как правило, имеют загадочные предупреждения типа «Не используйте stdout = PIPE или stderr = PIPE с этой функцией», поэтому позвольте мне предоставить еще немного:

Шаг 1. Запустите скрипт

check_output

Теперь процесс выполняется в фоновом режиме, и у вас есть ссылка на него.

РЕДАКТИРОВАТЬ: Я почти забыл - если вы хотите получить вывод позже, вы должны указать Python создать каналы чтения для стандартного вывода. Если вы не сделаете этот шаг, stdout и stderr просто перейдут к стандартному выводу вашей программы и стандартной ошибке, а proc = subprocess.Popen(["your_command", "parameter1", "paramter2"], stdout=subprocess.PIPE, stderr=subprocess.PIPE) не будет забрать их на шаге 2.

Шаг 2: дождитесь окончания процесса и получите его вывод

communicate

stdout, sterr = proc.communicate() return_code = proc.returncode позволяет вам сделать еще кое-что:

  • передать данные stdin процессу (параметр communicate)
  • укажите время завершения процесса, чтобы избежать зависания (параметр input=)

Обязательно также перехватывайте и обрабатывайте любые исключения из timeout= или Popen .


Если вас не волнует старый Python, есть более простой метод, который называется communicate , который все делает:

subprocess.run

Для проверки ошибок вы можете позвонить completed_process = subprocess.run( ['your_command', 'parameter'], stdout=subprocess.PIPE, stderr=subprocess.PIPE) # this starts the process, waits for it to finish, and gives you... completed_process.returncode completed_process.stdout completed_process.stderr или просто передать completed_process.check_returncode() в качестве дополнительного аргумента для check=True.

ответил Kos 3 52017vEurope/Moscow11bEurope/MoscowFri, 03 Nov 2017 23:24:35 +0300 2017, 23:24:35
0

Еще один, возможно, более простой метод:

import subprocess
try:
 output = subprocess.check_output("make", stderr=subprocess.STDOUT)
except subprocess.CalledProcessError as e:
  print('return code =', e.returncode)
  print(e.output)
ответил kichik 3 52017vEurope/Moscow11bEurope/MoscowFri, 03 Nov 2017 23:31:48 +0300 2017, 23:31:48

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132