Как проверить, выдает ли Popen из подпроцесса ошибку

Выберите каждый из [a] и пропустите все из [b]: Результат: 1, 5

var a = [1,4,5,9];
var b = [1,6,7,5];

for (i = 0; i < a.length; i++) {
    for (z = 0; z < a.length; z++) {
        if (a[i] === b[z]) {
            console.log(b[z]); // if match > console.log it 
        }
    }
}
1
задан martineau 15 January 2019 в 23:51
поделиться

1 ответ

Как check_call, так и check_output должен быть передан список команд, которые должны быть выполнены системой команд (тот же список команд, который будет отправлен в Popen). Оба они являются блокирующими вызовами, это означает, что Python будет ждать, пока они не закончат выполнять больше кода.

Использование Popen отправляет список команд в систему команд, но не блокирует дальнейшее выполнение кода Python. Вы можете зарегистрироваться в процессе, используя метод .poll объекта Popen, или вы можете сделать блокирующий вызов, используя .communicate, который вернет кортеж из стандартных выходных и стандартных потоков ошибок.

Предполагая, что вы хотите получить результаты выполненной команды, и команда будет правильно сообщать об ошибке в поток ошибок, вы можете использовать:

process = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = process.communicate()

if err:
     print('The process raised an error:', err.decode())

Вот несколько примеров:

Использование Popen:

import subprocess

# first a command that works correctly
proc = subprocess.Popen(['ls', '-a'], , stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = proc.communicate()
if not err:
    print('--No errors--\n', out.decode())
else:
    print('--Error--\n', err.decode())

# prints:
--No errors--
anaconda3
Desktop
Documents
Downloads

# next a command generates and error, the `-w` switch is invalid
proc = subprocess.Popen(['ls', '-w'], , stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = proc.communicate()
if not err:
    print('--No errors--\n', out.decode())
else:
    print('--Error--\n', err.decode())

# prints:
--Error--
 ls: option requires an argument -- 'w'
Try 'ls --help' for more information.

Использование check_call

check_call вызовет исключение Python, если код возврата из системы команд не равен 0.

# first with a working command:
ret_code = subprocess.check_call(['ls', '-a'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
ret_code
# returns:
0

# and now with the command that generates an error:
ret_code = subprocess.check_call(['ls', '-w'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)

# raises an exception:
---------------------------------------------------------------------------
CalledProcessError                        Traceback (most recent call last)
<ipython-input-25-3cd5107991a2> in <module>()
----> 1 ret_code = subprocess.check_call(['ls', '-w'], stdout=subprocess.PIPE, 
        stderr=subprocess.PIPE)

~/anaconda3/lib/python3.6/subprocess.py in check_call(*popenargs, **kwargs)
    289         if cmd is None:
    290             cmd = popenargs[0]
--> 291         raise CalledProcessError(retcode, cmd)
    292     return 0
    293

CalledProcessError: Command '['ls', '-w']' returned non-zero exit status 2.

Для обработки исключения используйте блок try/except.

try:
    ret_code = subprocess.check_call(['ls', '-w'], stdout=subprocess.PIPE, 
        stderr=subprocess.PIPE)
except subprocess.CalledProcessError as e:
    ret_code = e.returncode
    print('An error occurred.  Error code:', ret_code)

# prints:
An error occurred.  Error code: 2

Использование check_output

check_output очень похоже на check_call в том, что оно вызовет исключение Python, если код возврата из системы команд не равен 0. Однако если Код возврата равен 0, он вернет вывод в стандартном потоке вывода.

# just with the error process this time
try:
    ret_code = subprocess.check_output(['ls', '-w'], stdout=subprocess.PIPE, 
        stderr=subprocess.PIPE)
except subprocess.CalledProcessError as e:
    ret_code = e.returncode
    print('An error occurred.  Error code:', ret_code)

# prints:
An error occurred.  Error code: 2
0
ответ дан James 15 January 2019 в 23:51
поделиться
Другие вопросы по тегам:

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