Будьте в спящем режиме идентификационный генератор

Как 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
8
задан mainstringargs 30 January 2009 в 13:49
поделиться

2 ответа

Поверхностный поиск Google для 'в спящем режиме, пользовательское идентификационное учебное руководство по генератору' подняло следующие возможности. Я исключил тех, которые не выглядят полезными и суммировали содержание каждого.

Надежда, которая помогает.

11
ответ дан 5 December 2019 в 12:13
поделиться

http://resource.visual-paradigm.com/vpsuite2.3sp1/custom_id_generator.html

Хотя эта ссылка демонстрирует инструмент Visual-Paradigm для генерации Пользовательского идентификационного генератора, но идея В спящем режиме, Пользовательский идентификационный генератор может быть усвоен из того же

2
ответ дан 5 December 2019 в 12:13
поделиться
Другие вопросы по тегам:

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