import sh RunningCommand = sh.ls('-l')
RunningCommand
.Объект RunningCommand
представляет собой экземпляр команды, который был запущена или выполняется. Он существует как обертка вокруг низкоуровневого OProc
. Большая часть вашего взаимодействия с объектами модуля sh
происходит с экземплярами этого класса.
Предупреждение. Объекты этого класса ведут себя очень похоже на строки. Это было преднамеренное проектное решение, чтобы сделать “вывод” выполняемой команды более интуитивно понятным.
Имейте в виду, что функции Python, принимающие только реальные строки, например json.dumps
, не будут работать с экземплярами RunningCommand
, даже если они выглядят как строка.
RunningCommand
.RunningCommand.wait()
ждет завершение команды,RunningCommand.process
экземпляр низкоуровнего API OProc
,RunningCommand.stdout
содержимое stdout
,RunningCommand.stderr
содержимое stderr
,RunningCommand.exit_code
код завершения команды,RunningCommand.pid
идентификатор процесса,RunningCommand.sid
сеанс процесса,RunningCommand.pgid
группа процессов,RunningCommand.ctty
управляющее устройство,RunningCommand.signal()
отправляет сигнал процессу,RunningCommand.signal_group()
отправляет сигнал группе процессов,RunningCommand.terminate()
отправляет signal.SIGTERM
процессу,RunningCommand.kill()
отправляет signal.SIGKILL
процессу,RunningCommand.kill_group()
отправляет signal.SIGKILL
группе процессов,RunningCommand.is_alive()
True
, если процесс все еще жив,RunningCommand.wait(timeout=None)
:Метод RunningCommand.wait()
блокирует дальнейшее выполнение программы до завершения выполнения команды терминала и получения кода выхода. Если код выхода представляет собой сбой, мы вызываем соответствующее исключение. См. Исключения.
Аргумент timeout
- необязательное неотрицательное число для ожидания завершения команды. Если по истечении тайм-аута команда не завершается, то вызывается исключение sh.TimeoutException
.
Примечание. Многократный вызов этого метода вызывает исключение только при первом вызове.
модулем sh
вызывает метод автоматически, если только команда не выполняется асинхронно. В противном случае (фоновое выполнение команды) необходимо вызвать этот метод вручную, чтобы обеспечить завершение команды.
Если экземпляр Command
используется в качестве аргумента stdin
(смотрите Конвейеры), для этого экземпляра также вызывается метод .wait()
, и любые исключения, возникающие в результате этого процесса, распространяются вверх.
RunningCommand.process
:Атрибут RunningCommand.process
- базовый экземпляр низкоуровнего API OProc
.
RunningCommand.stdout
:Атрибут RunningCommand.stdout
- свойство @property, которое вызывает метод .wait()
, а затем возвращает содержимое того, что процесс записал в stdout
.
RunningCommand.stderr
:Атрибут RunningCommand.stderr
- свойство @property, которое вызывает метод .wait()
, а затем возвращает содержимое того, что процесс записал в stderr
.
RunningCommand.exit_code
:Атрибут RunningCommand.exit_code
- свойство @property, которое вызывает метод .wait()
, а затем возвращает код выхода процесса.
RunningCommand.pid
:Атрибут RunningCommand.pid
- идентификатор процесса.
RunningCommand.sid
:Атрибут RunningCommand.sid
- идентификатор сеанса процесса. Обычно это будет другой сеанс, чем текущий процесс python, если не было указано _new_session=False
.
RunningCommand.pgid
:Атрибут RunningCommand.pgid
- идентификатор группы процессов.
RunningCommand.ctty
:Атрибут RunningCommand.ctty
- управляющее оконечное устройство, если таковое имеется..
RunningCommand.signal(sig_num)
:Метод RunningCommand.signal()
отправляет sig_num
процессу.
Обычно используется со значением из модуля signal
, например sig_num=signal.SIGHUP
.
RunningCommand.signal_group(sig_num)
:Метод RunningCommand.signal_group()
отправляет sig_num
каждому процессу в группе процессов.
Обычно используется со значением из модуля signal
, например sig_num=signal.SIGHUP
.
RunningCommand.terminate()
:Метод RunningCommand.terminate()
ссылка на вызов RunningCommand.signal(signal.SIGTERM)
.
RunningCommand.kill()
:Метод RunningCommand.kill()
ссылка на вызов RunningCommand.signal(signal.SIGKILL)
.
RunningCommand.kill_group()
:Метод RunningCommand.kill_group()
ссылка на вызов RunningCommand.signal_group(signal.SIGKILL)
.
RunningCommand.is_alive()
:Метод RunningCommand.is_alive()
возвращает True
, если процесс все еще жив, если нет, то False
.
import sh try: # запуск команды в блокирующем режиме sh.sleep(10, _timeout=1) except sh.TimeoutException: print("we timed out, as expected")
Также исключение возникает при указании таймаута для RunningCommand.wait(timeout=None)
:
import sh # запуск команды в фоновом режиме p = sh.sleep(10, _bg=True) try: p.wait(timeout=1) except sh.TimeoutException: print("время ожидания кончилось") # убиваем фоновый процесс p.kill()