Доброго времени суток, читатели, зрители моего канала 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.