Найти в Дзене

Программирование на Python. Многозадачность. subprocess.run, subprocess.Popen. Приложение 2 к видео 17

Оглавление

Доброго времени суток, читатели, зрители моего канала programmer's notes. Не забывайте подписываться и писать свои комментарии к моим статьям и видео.

А это две из восьми подборок моего канала канала о программировании на языке Python

Приложение 2 к видео (Приложение 1)

Справочник по run и Popen

Сегодня в статье в основном справочная информация по известным уже вам методам модуля subprocess.

Метод run

Метод может иметь большое количество именованных параметров и при запуске он возвращает управление после того, как программа закончит свою работу.

run(args, *, stdin=None, input=None, stdout=None,
stderr=None, capture_output=False, shell=False,
cwd=None, timeout=None, check=False,
encoding=None, errors=None, text=None,
env=None, universal_newlines=None)

  • args — программа запуска с параметрами в виде списка или одной строкой.
  • stdin — входящий для запускаемой программы поток.
  • input — входящий для запускаемой программы поток.
  • stdout — поток вывода программы.
  • stderr — поток вывода ошибок программы.
  • capture_output — определяет, будут ли захватываться stdout и stderr.
  • shell — определяет будет ли запускаемая программа с параметрами представлена одной строкой (True).
  • cwd — путь к рабочему каталогу программы.
  • timeout — можно указать максимальное время выполнения программы.
  • check — если True, то в случае завершения программы с ошибками вызывается исключение.
  • encoding — кодировка, если input является строкой.
  • errors — можно указать обработчик ошибки кодировки.
  • text — если True, то для stdin, stdout, stderr предполагается текстовый режим.
  • env — указывает среду для запускаемой программы.
  • universal_newlines — аналогично параметру text.

Метод возвращает объект result со следующими компонентами

  • result.args — аргументы, используемые при запуске процесса.
  • result.returncode — код возврата.
  • result.stdout — выходной поток.
  • result.stderr — выходной поток ошибок.
  • result.check_returncode() — вызывает исключение, код возврата не равен нулю.

В предыдущем приложении были приведены примеры использования метода run. Еще один пример использования метода run.

import subprocess
p = subprocess.run("ls -R  /tmp", shell=True, capture_output=True, encoding='utf-8')
print(p.stdout)
print('-------------------')
print(p.returncode)
print(p.args)

Результат выполнения фрагмента

/tmp:
dbus-j7ijyIAFBD
pulse-PKdhtXMmr18n
systemd-private-159fbca4e54041cbab7813d86aaa57a6-chronyd.service-jnMh9h
systemd-private-159fbca4e54041cbab7813d86aaa57a6-colord.service-Aums9g
systemd-private-159fbca4e54041cbab7813d86aaa57a6-ModemManager.service-Oz68bf
systemd-private-159fbca4e54041cbab7813d86aaa57a6-systemd-logind.service-UGofgh
systemd-private-159fbca4e54041cbab7813d86aaa57a6-upower.service-quKIQf
-------------------
1
ls -R  /tmp

Код возврата 1, так как при выполнении программы произошла ошибка.

Метод Popen

Приведём описание параметров функции, которая запускает указанную в ней программу в фоновом режиме.

subprocess.Popen(args, bufsize=-1, executable=None, \
stdin=None, stdout=None, stderr=None, \
preexec_fn=None, close_fds=True, shell=False, \
cwd=None, env=None, universal_newlines=None, \
startupinfo=None, creationflags=0, restore_signals=True, \
start_new_session=False, pass_fds=(), *, \
encoding=None, errors=None, text=None)

  • args программа запуска с параметрами в виде списка или одной строкой.
  • bufsize определяет буферизацию.
  • executable замещающая программа для выполнения (если shell=False). Например, если требуется запустить, для которого также нужно указать исполнителя.
  • stdin — входящий для запускаемой программы поток.
  • stdout — поток вывода программы.
  • stderr — поток вывода ошибок программы.
  • preexec_fn — можно указать пользовательскую функцию, которая выполниться до запуска указанной программы.
  • close_fds — если True, то все файловые дескрипторы, не связанные со стандартными потоками вывода будут закрыты до выполнения дочернего процесса.
  • shell — определяет будет ли запускаемая программа с параметрами представлена одной строкой (True).
  • cwd — путь к рабочему каталогу программы.
  • env — указывает среду для запускаемой программы.
  • text — если True, то для stdin, stdout, stderr предполагается текстовый режим.
  • universal_newlines — аналогично параметру text.
  • encoding — кодировка, если input является строкой.
  • errors — можно указать обработчик ошибки кодировки.
  • startupinfo — структура, которая может заполняться в Windows.
  • creationflags — флаги, используемые в Windows.
  • restore_signals — если True, то все сигналы восстанавливаются до выполнения дочернего процесса.
  • start_new_session имеет значение True, то системный вызов setsid() будет сделан в дочернем процессе до начала запуска программы.
  • pass_fds — последовательность файловых дескрипторов.

Функция возвращает объект Popen(). Рассмотрим компоненты объекта.

  • poll() — возвращает None, если процесс не закончил свою работу, иначе 0 или другое целое число, которое возвратил исполняемый процесс.
  • wait() — ожидает. когда процесс будет закончен.
  • communicate(input=None, timeout=None) — с помощью данного метода можно отправлять исполняемому процессу данные, а также читает выходные потоки запущенного процесса.
  • send_signal(signal) — посылает сигнал запущенному процессу.
  • terminate() — останавливает дочерний процесс.
  • kill() — убивает дочерний процесс.
  • args — возвращает строку запуска.
  • stdin — возвращает входной поток.
  • stdout — возвращает стандартный выходной поток.
  • stderr — возвращает стандартный выходной поток ошибок.
  • pid — возвращает идентификатор запущенного выходного процесса.

Приведём ещё один пример (см. также) использования Popen()

import subprocess
p = subprocess.Popen(['ls', '/tmp'], shell=False)
p.wait()
print(p.stdout)

Результат работы фрагмента

dbus-j7ijyIAFBD
pulse-PKdhtXMmr18n
systemd-private-159fbca4e54041cbab7813d86aaa57a6-chronyd.service-jnMh9h
systemd-private-159fbca4e54041cbab7813d86aaa57a6-colord.service-Aums9g
systemd-private-159fbca4e54041cbab7813d86aaa57a6-ModemManager.service-Oz68bf
systemd-private-159fbca4e54041cbab7813d86aaa57a6-systemd-logind.service-UGofgh
systemd-private-159fbca4e54041cbab7813d86aaa57a6-upower.service-quKIQf
None

Хорошего программирования. Оставляйте свои комментарии, не забывайте про лайки и подписывайтесь на мой канал programmer's notes.

Я убрал ваши комментарии, программа стала компактной и понятной
Я убрал ваши комментарии, программа стала компактной и понятной