Как 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
Поверхностный поиск Google для 'в спящем режиме, пользовательское идентификационное учебное руководство по генератору' подняло следующие возможности. Я исключил тех, которые не выглядят полезными и суммировали содержание каждого.
Надежда, которая помогает.
http://resource.visual-paradigm.com/vpsuite2.3sp1/custom_id_generator.html
Хотя эта ссылка демонстрирует инструмент Visual-Paradigm для генерации Пользовательского идентификационного генератора, но идея В спящем режиме, Пользовательский идентификационный генератор может быть усвоен из того же