Модуль subprocess відповідає за виконання наступних дій: породження нових процесів, з'єднання c потоками стандартного введення, стандартного виводу, стандартного виводу повідомлень про помилки і отримання кодів повернення від цих процесів.
Рекомендованим підходом до роботи з підпроцесами є використання наступних допоміжних функцій для всіх випадків, де вони можуть впоратися. Для більш складних випадків може бути використаний безпосередньо інтерфейс Popen.
subprocess.call (args, *, stdin = None, stdout = None, stderr = None, shell = False, timeout = None) - виконує команду, описану args. Чекає завершення команди, а потім повертає код повернення.
Аргументи, наведені вище, є лише найбільш поширеними з них. Повна сигнатура функція в значній мірі така ж, як конструктор Popen. Аргумент timeout передається Popen.wait (). Якщо тайм-аут закінчується, дочірній процес буде убитий, а потім буде піднято виняток TimeoutExpired.
subprocess.check_call (args, *, stdin = None, stdout = None, stderr = None, shell = False, timeout = None) - виконує команду, описану args. Чекає завершення команди, а потім завершується, якщо код повернення 0, або піднімає виняток CalledProcessError, об'єкт якого повертає код завершення атрибутом returncode.
subprocess.check_output (args, *, input = None, stdin = None, stderr = None, shell = False, universal_newlines = False, timeout = None) - виконує команду і повертає її висновок. Піднімає виняток CalledProcessError, якщо код повернення ненульовий.
Створення нових процесів і управління ними в даному модулі обробляється класом Popen. Він пропонує велику гнучкість, так що розробники можуть впоратися з менш поширеними випадками, не охопленими зручними функціями.
subprocess.DEVNULL - значення, яке може використовуватися як аргумент stdin, stdout або stderr. Чи означає, що буде використаний спеціальний файл devnull.
subprocess.PIPE - значення, яке може використовуватися як аргумент stdin, stdout або stderr. Чи означає, що для дочірнього процесу буде створено пайп.
subprocess.STDOUT - значення, яке може використовуватися як аргумент stderr. Чи означає, що потік помилок буде перенаправлений в потік виводу.
Клас 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 = False, startupinfo = None, creationflags = 0, restore_signals = True, start_new_session = False, pass_fds = ()) - Виконує програму в новому процесі. args - рядок або послідовність аргументів програми. Зазвичай першим вказують виконувану програму, а потім аргументи, але також її можна вказати в параметрі executable.
Методи класу Popen:
Popen.poll () - якщо процес завершив роботу - поверне код повернення, в іншому випадку None.
Popen.wait (timeout = None) - очікує завершення роботи процесу і повертає код повернення. Якщо протягом timeout процес не завершився, підніметься виняток TimeoutExpired (яке можна перехопити, після чого зробити ще раз wait).
Цей метод може викликати блокування (зависання), якщо встановлено stdout = PIPE або stderr = PIPE, і дочірній процес генерує велику кількість даних в stdout і stderr. Використання communicate () дозволить уникнути цього.
Popen.communicate (input = None, timeout = None) - взаімодействовует з процесом: посилає дані, що містяться в input в stdin процесу, очікує завершення роботи процесу, повертає кортеж даних потоку виведення і помилок. При цьому в Popen необхідно задати значення PIPE для stdin (якщо ви хочете посилати в stdin), stdout, stderr (якщо ви хочете прочитати висновок дочірнього процесу).
Якщо протягом timeout процес не завершився, підніметься виняток TimeoutExpired (яке можна перехопити, після чого зробити ще раз communicate, або вбити дочірній процес).
Popen.send_signal (signal) - посилає сигнал signal.
Popen.terminate () - зупиняє дочірній процес.
Popen.kill () - вбиває дочірній процес.