subprocess — Subprocess management

Вихідний код: Lib/subprocess.py


Модуль subprocess дозволяє створювати нові процеси, підключатися до їхніх каналів вводу/виводу/помилок і отримувати їхні коди повернення. Цей модуль призначений для заміни кількох старих модулів і функцій:

os.system
os.spawn*

Інформацію про те, як модуль subprocess можна використовувати для заміни цих модулів і функцій, можна знайти в наступних розділах.

Дивись також

PEP 324 – PEP пропонує модуль підпроцесу

Використання модуля subprocess

Рекомендований підхід до виклику підпроцесів полягає у використанні функції run() для всіх випадків використання, які вона може обробляти. Для більш складних випадків використання базовий інтерфейс Popen можна використовувати безпосередньо.

The run() function was added in Python 3.5; if you need to retain compatibility with older versions, see the Старіший API високого рівня section.

subprocess.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, **other_popen_kwargs)

Виконайте команду, описану args. Зачекайте, поки команда завершиться, а потім поверніть екземпляр CompletedProcess.

Наведені вище аргументи є лише найпоширенішими, описаними нижче в Часто використовувані аргументи (звідси використання лише нотації ключових слів у скороченому підписі). Повна сигнатура функції здебільшого така сама, як і у конструктора Popen – більшість аргументів цієї функції передаються до цього інтерфейсу. (timeout, input, check і capture_output не є.)

If capture_output is true, stdout and stderr will be captured. When used, the internal Popen object is automatically created with stdout=PIPE and stderr=PIPE. The stdout and stderr arguments may not be supplied at the same time as capture_output. If you wish to capture and combine both streams into one, use stdout=PIPE and stderr=STDOUT instead of capture_output.

The timeout argument is passed to Popen.communicate(). If the timeout expires, the child process will be killed and waited for. The TimeoutExpired exception will be re-raised after the child process has terminated.

The input argument is passed to Popen.communicate() and thus to the subprocess’s stdin. If used it must be a byte sequence, or a string if encoding or errors is specified or text is true. When used, the internal Popen object is automatically created with stdin=PIPE, and the stdin argument may not be used as well.

Якщо check має значення true, і процес завершується з ненульовим кодом виходу, буде викликано виняток CalledProcessError. Атрибути цього винятку містять аргументи, код виходу, а також stdout і stderr, якщо вони були захоплені.

Якщо вказано кодування або помилки, або текст має значення true, файлові об’єкти для stdin, stdout і stderr відкриваються в текстовому режимі з використанням указаного кодування та помилок або io.TextIOWrapper за замовчуванням. Аргумент universal_newlines еквівалентний text і надається для зворотної сумісності. За замовчуванням файлові об’єкти відкриваються у двійковому режимі.

If env is not None, it must be a mapping that defines the environment variables for the new process; these are used instead of the default behavior of inheriting the current process“ environment. It is passed directly to Popen.

Приклади:

>>> subprocess.run(["ls", "-l"])  # doesn't capture output
CompletedProcess(args=['ls', '-l'], returncode=0)

>>> subprocess.run("exit 1", shell=True, check=True)
Traceback (most recent call last):
  ...
subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1

>>> subprocess.run(["ls", "-l", "/dev/null"], capture_output=True)
CompletedProcess(args=['ls', '-l', '/dev/null'], returncode=0,
stdout=b'crw-rw-rw- 1 root root 1, 3 Jan 23 16:23 /dev/null\n', stderr=b'')

Нове в версії 3.5.

Змінено в версії 3.6: Додано параметри кодування та помилки

Змінено в версії 3.7: Додано параметр text як більш зрозумілий псевдонім universal_newlines. Додано параметр capture_output.

Змінено в версії 3.9.17: Changed Windows shell search order for shell=True. The current directory and %PATH% are replaced with %COMSPEC% and %SystemRoot%\System32\cmd.exe. As a result, dropping a malicious program named cmd.exe into a current directory no longer works.

class subprocess.CompletedProcess

Повернене значення від run(), що представляє процес, який завершився.

args

Аргументи, які використовуються для запуску процесу. Це може бути список або рядок.

returncode

Статус виходу дочірнього процесу. Як правило, статус виходу 0 вказує на успішне виконання.

Від’ємне значення -N вказує на те, що дочірній елемент було завершено сигналом N (лише POSIX).

stdout

Перехоплений stdout із дочірнього процесу. Послідовність байтів або рядок, якщо run() було викликано з кодуванням, помилками або text=True. None, якщо stdout не було захоплено.

Якщо ви запустили процес із stderr=subprocess.STDOUT, stdout і stderr буде об’єднано в цьому атрибуті, а stderr буде None.

stderr

Захоплений stderr із дочірнього процесу. Послідовність байтів або рядок, якщо run() було викликано з кодуванням, помилками або text=True. None, якщо stderr не було захоплено.

check_returncode()

Якщо returncode не дорівнює нулю, викликається CalledProcessError.

Нове в версії 3.5.

subprocess.DEVNULL

Спеціальне значення, яке можна використовувати як аргумент stdin, stdout або stderr для Popen і вказує, що використовуватиметься спеціальний файл os.devnull.

Нове в версії 3.3.

subprocess.PIPE

Спеціальне значення, яке можна використовувати як аргумент stdin, stdout або stderr для Popen і вказує, що канал до стандартного потоку має бути відкритий. Найкорисніше з Popen.communicate().

subprocess.STDOUT

Спеціальне значення, яке можна використовувати як аргумент stderr для Popen і вказує, що стандартна помилка має надходити в той самий дескриптор, що й стандартний вихід.

exception subprocess.SubprocessError

Базовий клас для всіх інших винятків із цього модуля.

Нове в версії 3.3.

exception subprocess.TimeoutExpired

Підклас SubprocessError, викликається, коли закінчується час очікування під час очікування дочірнього процесу.

cmd

Команда, яка була використана для створення дочірнього процесу.

timeout

Час очікування в секундах.

output

Output of the child process if it was captured by run() or check_output(). Otherwise, None. This is always bytes when any output was captured regardless of the text=True setting. It may remain None instead of b'' when no output was observed.

stdout

Псевдонім для виведення, для симетрії з stderr.

stderr

Stderr output of the child process if it was captured by run(). Otherwise, None. This is always bytes when stderr output was captured regardless of the text=True setting. It may remain None instead of b'' when no stderr output was observed.

Нове в версії 3.3.

Змінено в версії 3.5: Додано атрибути stdout і stderr

exception subprocess.CalledProcessError

Підклас SubprocessError, який виникає, коли процес, запущений check_call(), check_output() або run() (із check=True), повертає не- нульовий статус виходу.

returncode

Статус виходу дочірнього процесу. Якщо процес завершився через сигнал, це буде негативне число сигналу.

cmd

Команда, яка була використана для створення дочірнього процесу.

output

Висновок дочірнього процесу, якщо він був захоплений run() або check_output(). В іншому випадку Жодного.

stdout

Псевдонім для виведення, для симетрії з stderr.

stderr

Висновок stderr дочірнього процесу, якщо він був захоплений run(). В іншому випадку Жодного.

Змінено в версії 3.5: Додано атрибути stdout і stderr

Часто використовувані аргументи

Щоб підтримувати широкий спектр варіантів використання, конструктор Popen (і зручні функції) приймають велику кількість необов’язкових аргументів. Для більшості типових випадків використання багато з цих аргументів можна безпечно залишити за умовчанням. Найчастіше потрібні такі аргументи:

args є обов’язковим для всіх викликів і має бути рядком або послідовністю аргументів програми. Надання послідовності аргументів зазвичай є кращим, оскільки це дозволяє модулю подбати про будь-які необхідні екранування та цитування аргументів (наприклад, дозволити пробіли в іменах файлів). Якщо передається один рядок, або shell має бути True (див. нижче), або в іншому випадку рядок має просто назвати програму, яку потрібно виконати, без вказівки жодних аргументів.

stdin, stdout and stderr specify the executed program’s standard input, standard output and standard error file handles, respectively. Valid values are PIPE, DEVNULL, an existing file descriptor (a positive integer), an existing file object with a valid file descriptor, and None. PIPE indicates that a new pipe to the child should be created. DEVNULL indicates that the special file os.devnull will be used. With the default settings of None, no redirection will occur; the child’s file handles will be inherited from the parent. Additionally, stderr can be STDOUT, which indicates that the stderr data from the child process should be captured into the same file handle as for stdout.

Якщо вказано кодування або помилки, або текст (також відомий як universal_newlines) має значення true, файлові об’єкти stdin, stdout і stderr буде відкрито в текстовому режимі за допомогою кодування і помилки, указані у виклику або за замовчуванням для io.TextIOWrapper.

Для stdin символи закінчення рядків '\n' у вхідних даних буде перетворено на роздільник рядків за замовчуванням os.linesep. Для stdout і stderr усі закінчення рядків у виводі буде перетворено на '\n'. Для отримання додаткової інформації дивіться документацію класу io.TextIOWrapper, якщо аргумент нового рядка його конструктора має значення None.

Якщо текстовий режим не використовується, stdin, stdout і stderr будуть відкриті як бінарні потоки. Кодування або перетворення закінчення рядка не виконується.

Нове в версії 3.6: Added encoding and errors parameters.

Нове в версії 3.7: Додано параметр text як псевдонім для universal_newlines.

Примітка

Атрибут нового рядка об’єктів файлу Popen.stdin, Popen.stdout і Popen.stderr не оновлюється методом Popen.communicate().

Якщо shell має значення True, зазначена команда буде виконана через оболонку. Це може бути корисним, якщо ви використовуєте Python насамперед для розширеного потоку керування, який він пропонує для більшості системних оболонок, і все ще бажаєте зручний доступ до інших функцій оболонки, таких як канали оболонки, символи підстановки імен файлів, розширення змінних середовища та розширення ~ до домашнього каталогу користувача. Однак зауважте, що сам Python пропонує реалізацію багатьох функцій, подібних до оболонки (зокрема, glob, fnmatch, os.walk(), os.path.expandvars(), os.path.expanduser() і shutil).

Змінено в версії 3.3: Якщо universal_newlines має значення True, клас використовує кодування locale.getpreferredencoding(False) замість locale.getpreferredencoding(). Перегляньте клас io.TextIOWrapper для отримання додаткової інформації про цю зміну.

Примітка

Перед використанням shell=True прочитайте розділ Security Considerations.

Ці параметри разом з усіма іншими опціями описані більш детально в документації конструктора Popen.

Конструктор Popen

Створення основного процесу та керування ним у цьому модулі обробляється класом Popen. Він пропонує велику гнучкість, щоб розробники могли обробляти менш поширені випадки, які не охоплюються функціями зручності.

class 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=(), *, group=None, extra_groups=None, user=None, umask=-1, encoding=None, errors=None, text=None)

Execute a child program in a new process. On POSIX, the class uses os.execvp()-like behavior to execute the child program. On Windows, the class uses the Windows CreateProcess() function. The arguments to Popen are as follows.

args має бути послідовністю аргументів програми або одним рядком або path-like object. За замовчуванням програма для виконання є першим елементом у args, якщо args є послідовністю. Якщо args є рядком, інтерпретація залежить від платформи та описана нижче. Перегляньте аргументи shell і executable, щоб дізнатися про додаткові відмінності від поведінки за замовчуванням. Якщо не вказано інше, рекомендується передавати args як послідовність.

Приклад передачі деяких аргументів зовнішній програмі у вигляді послідовності:

Popen(["/usr/bin/git", "commit", "-m", "Fixes a bug."])

У POSIX, якщо args є рядком, рядок інтерпретується як ім’я або шлях до програми для виконання. Однак це можна зробити, лише якщо не передати аргументи програмі.

Примітка

Може бути неочевидним, як розбити команду оболонки на послідовність аргументів, особливо у складних випадках. shlex.split() може проілюструвати, як визначити правильну токенізацію для args:

>>> import shlex, subprocess
>>> command_line = input()
/bin/vikings -input eggs.txt -output "spam spam.txt" -cmd "echo '$MONEY'"
>>> args = shlex.split(command_line)
>>> print(args)
['/bin/vikings', '-input', 'eggs.txt', '-output', 'spam spam.txt', '-cmd', "echo '$MONEY'"]
>>> p = subprocess.Popen(args) # Success!

Зокрема, зауважте, що параметри (такі як -input) і аргументи (такі як eggs.txt), відокремлені пробілами в оболонці, розміщуються в окремих елементах списку, тоді як аргументи, які потребують лапок або екранування зворотної скісної риски, коли використовуються в shell (наприклад, імена файлів, що містять пробіли, або команда echo, показана вище) є одними елементами списку.

У Windows, якщо args є послідовністю, вона буде перетворена на рядок у спосіб, описаний у Перетворення послідовності аргументів на рядок у Windows. Це тому, що базовий CreateProcess() працює з рядками.

Змінено в версії 3.6: Параметр args приймає path-like object, якщо shell має значення False, і послідовність, що містить шляхові об’єкти на POSIX.

Змінено в версії 3.8: Параметр args приймає path-like object, якщо shell має значення False, а також послідовність, що містить байти та шляхоподібні об’єкти у Windows.

Аргумент shell (який за замовчуванням має значення False) визначає, чи використовувати оболонку як програму для виконання. Якщо shell має значення True, рекомендується передавати args як рядок, а не як послідовність.

У POSIX із shell=True оболонкою за замовчуванням є /bin/sh. Якщо args є рядком, цей рядок визначає команду для виконання через оболонку. Це означає, що рядок має бути відформатований точно так, як він був би під час введення в команду оболонки. Це включає, наприклад, лапки або екранування назв файлів із пробілами. Якщо args є послідовністю, перший елемент визначає командний рядок, а будь-які додаткові елементи розглядатимуться як додаткові аргументи самої оболонки. Тобто Popen виконує еквівалент:

Popen(['/bin/sh', '-c', args[0], args[1], ...])

У Windows із shell=True змінна середовища COMSPEC визначає оболонку за замовчуванням. Єдиний раз, коли вам потрібно вказати shell=True у Windows, це коли команда, яку ви хочете виконати, вбудована в оболонку (наприклад, dir або copy). Вам не потрібен shell=True для запуску пакетного файлу або виконуваного файлу на консолі.

Примітка

Перед використанням shell=True прочитайте розділ Security Considerations.

bufsize буде надано як відповідний аргумент функції open() під час створення об’єктів файлу каналу stdin/stdout/stderr:

  • 0 means unbuffered (read and write are one system call and can return short)

  • 1 means line buffered (only usable if universal_newlines=True i.e., in a text mode)

  • будь-яке інше позитивне значення означає використання буфера приблизно такого розміру

  • negative bufsize (за замовчуванням) означає, що буде використано системне значення io.DEFAULT_BUFFER_SIZE.

Змінено в версії 3.3.1: bufsize now defaults to -1 to enable buffering by default to match the behavior that most code expects. In versions prior to Python 3.2.4 and 3.3.1 it incorrectly defaulted to 0 which was unbuffered and allowed short reads. This was unintentional and did not match the behavior of Python 2 as most code expected.

Аргумент executable визначає програму заміни для виконання. Це дуже рідко потрібно. Коли shell=False, executable замінює програму для виконання, указану args. Однак оригінальні args усе ще передаються програмі. Більшість програм розглядають програму, визначену args, як назву команди, яка потім може відрізнятися від фактично виконаної програми. У POSIX ім’я args стає відображуваним ім’ям для виконуваного файлу в таких утилітах, як ps. Якщо shell=True, у POSIX виконуваний аргумент вказує на заміну оболонки для типового /bin/sh.

Змінено в версії 3.6: Параметр executable приймає path-like object на POSIX.

Змінено в версії 3.8: Параметр executable приймає байти та path-like object у Windows.

Змінено в версії 3.9.17: Changed Windows shell search order for shell=True. The current directory and %PATH% are replaced with %COMSPEC% and %SystemRoot%\System32\cmd.exe. As a result, dropping a malicious program named cmd.exe into a current directory no longer works.

stdin, stdout and stderr specify the executed program’s standard input, standard output and standard error file handles, respectively. Valid values are PIPE, DEVNULL, an existing file descriptor (a positive integer), an existing file object with a valid file descriptor, and None. PIPE indicates that a new pipe to the child should be created. DEVNULL indicates that the special file os.devnull will be used. With the default settings of None, no redirection will occur; the child’s file handles will be inherited from the parent. Additionally, stderr can be STDOUT, which indicates that the stderr data from the applications should be captured into the same file handle as for stdout.

Якщо preexec_fn встановлено на об’єкт, який можна викликати, цей об’єкт буде викликано в дочірньому процесі безпосередньо перед виконанням дочірнього процесу. (лише POSIX)

Попередження

The preexec_fn parameter is not safe to use in the presence of threads in your application. The child process could deadlock before exec is called. If you must use it, keep it trivial! Minimize the number of libraries you call into.

Примітка

If you need to modify the environment for the child use the env parameter rather than doing it in a preexec_fn. The start_new_session parameter can take the place of a previously common use of preexec_fn to call os.setsid() in the child.

Змінено в версії 3.8: Параметр preexec_fn більше не підтримується субінтерпретаторами. Використання параметра у субінтерпретаторі викликає RuntimeError. Нове обмеження може вплинути на програми, які розгортаються в mod_wsgi, uWSGI та інших вбудованих середовищах.

If close_fds is true, all file descriptors except 0, 1 and 2 will be closed before the child process is executed. Otherwise when close_fds is false, file descriptors obey their inheritable flag as described in Успадкування файлових дескрипторів.

У Windows, якщо close_fds має значення true, дочірній процес не успадкує жодних дескрипторів, якщо вони явно не передані в елементі handle_list STARTUPINFO.lpAttributeList або за допомогою стандартного переспрямування дескриптора.

Змінено в версії 3.2: Типове значення для close_fds було змінено з False на описане вище.

Змінено в версії 3.7: У Windows типове значення для close_fds було змінено з False на True під час переспрямування стандартних дескрипторів. Тепер можна встановити close_fds на True під час перенаправлення стандартних дескрипторів.

pass_fds — це необов’язкова послідовність файлових дескрипторів, які залишаються відкритими між батьківським і дочірнім. Надання будь-якого pass_fds змушує close_fds мати значення True. (лише POSIX)

Змінено в версії 3.2: Додано параметр pass_fds.

If cwd is not None, the function changes the working directory to cwd before executing the child. cwd can be a string, bytes or path-like object. In particular, the function looks for executable (or for the first item in args) relative to cwd if the executable path is a relative path.

Змінено в версії 3.6: Параметр cwd приймає path-like object на POSIX.

Змінено в версії 3.7: Параметр cwd приймає path-like object у Windows.

Змінено в версії 3.8: Параметр cwd приймає об’єкт bytes у Windows.

Якщо restore_signals має значення true (за замовчуванням), усі сигнали, які Python встановив як SIG_IGN, відновлюються до SIG_DFL у дочірньому процесі перед виконанням. Наразі це включає сигнали SIGPIPE, SIGXFZ і SIGXFSZ. (лише POSIX)

Змінено в версії 3.2: Додано restore_signals.

If start_new_session is true the setsid() system call will be made in the child process prior to the execution of the subprocess. (POSIX only)

Змінено в версії 3.2: Додано start_new_session.

If group is not None, the setregid() system call will be made in the child process prior to the execution of the subprocess. If the provided value is a string, it will be looked up via grp.getgrnam() and the value in gr_gid will be used. If the value is an integer, it will be passed verbatim. (POSIX only)

Availability: POSIX

Нове в версії 3.9.

If extra_groups is not None, the setgroups() system call will be made in the child process prior to the execution of the subprocess. Strings provided in extra_groups will be looked up via grp.getgrnam() and the values in gr_gid will be used. Integer values will be passed verbatim. (POSIX only)

Availability: POSIX

Нове в версії 3.9.

If user is not None, the setreuid() system call will be made in the child process prior to the execution of the subprocess. If the provided value is a string, it will be looked up via pwd.getpwnam() and the value in pw_uid will be used. If the value is an integer, it will be passed verbatim. (POSIX only)

Availability: POSIX

Нове в версії 3.9.

Якщо umask не є негативним, системний виклик umask() буде здійснено в дочірньому процесі перед виконанням підпроцесу.

Availability: POSIX

Нове в версії 3.9.

If env is not None, it must be a mapping that defines the environment variables for the new process; these are used instead of the default behavior of inheriting the current process“ environment.

Примітка

Якщо вказано, env має надавати будь-які змінні, необхідні для виконання програми. У Windows, щоб запустити паралельну збірку (side-by-side assembly), указаний env має містити дійсний SystemRoot.

If encoding or errors are specified, or text is true, the file objects stdin, stdout and stderr are opened in text mode with the specified encoding and errors, as described above in Часто використовувані аргументи. The universal_newlines argument is equivalent to text and is provided for backwards compatibility. By default, file objects are opened in binary mode.

Нове в версії 3.6: Додано кодування та помилки.

Нове в версії 3.7: текст додано як більш читабельний псевдонім для universal_newlines.

If given, startupinfo will be a STARTUPINFO object, which is passed to the underlying CreateProcess function. creationflags, if given, can be one or more of the following flags:

Об’єкти Popen підтримуються як контекстні менеджери через оператор with: під час виходу стандартні дескриптори файлів закриваються, і процес очікується.

with Popen(["ifconfig"], stdout=PIPE) as proc:
    log.write(proc.stdout.read())

Popen та інші функції в цьому модулі, які його використовують, викликають подію аудиту subprocess.Popen з аргументами executable, args, cwd і env. Значення для args може бути одним рядком або списком рядків, залежно від платформи.

Змінено в версії 3.2: Додано підтримку менеджера контексту.

Змінено в версії 3.6: Деструктор Popen тепер видає попередження ResourceWarning, якщо дочірній процес все ще виконується.

Змінено в версії 3.8: Popen може використовувати os.posix_spawn() у деяких випадках для кращої продуктивності. У підсистемі Windows для Linux і емуляції користувача QEMU конструктор Popen, що використовує os.posix_spawn(), більше не створює виняток у разі помилки, як-от відсутня програма, але дочірній процес завершується помилкою з ненульовим returncode.

Винятки

Винятки, створені в дочірньому процесі, перш ніж нова програма почне виконуватися, будуть повторно викликані в батьківському.

Найпоширенішим винятком є OSError. Це відбувається, наприклад, при спробі запустити неіснуючий файл. Програми повинні підготуватися до винятків OSError. Зауважте, що коли shell=True, OSError буде викликано дочірнім елементом, лише якщо саму вибрану оболонку не знайдено. Щоб визначити, чи не вдалося командній оболонці знайти запитану програму, необхідно перевірити код повернення або вихідні дані підпроцесу.

Помилка ValueError буде викликана, якщо Popen викликається з недійсними аргументами.

check_call() і check_output() викличуть CalledProcessError, якщо викликаний процес повертає ненульовий код повернення.

All of the functions and methods that accept a timeout parameter, such as call() and Popen.communicate() will raise TimeoutExpired if the timeout expires before the process exits.

Усі винятки, визначені в цьому модулі, успадковуються від SubprocessError.

Нове в версії 3.3: Додано базовий клас SubprocessError.

Міркування безпеки

Unlike some other popen functions, this library will not implicitly choose to call a system shell. This means that all characters, including shell metacharacters, can safely be passed to child processes. If the shell is invoked explicitly, via shell=True, it is the application’s responsibility to ensure that all whitespace and metacharacters are quoted appropriately to avoid shell injection vulnerabilities.

When using shell=True, the shlex.quote() function can be used to properly escape whitespace and shell metacharacters in strings that are going to be used to construct shell commands.

On Windows, batch files (*.bat or *.cmd) may be launched by the operating system in a system shell regardless of the arguments passed to this library. This could result in arguments being parsed according to shell rules, but without any escaping added by Python. If you are intentionally launching a batch file with arguments from untrusted sources, consider passing shell=True to allow Python to escape special characters. See gh-114539 for additional discussion.

Відкрити об’єкти

Екземпляри класу Popen мають такі методи:

Popen.poll()

Перевірте, чи завершився дочірній процес. Встановити та повернути атрибут returncode. В іншому випадку повертає None.

Popen.wait(timeout=None)

Дочекайтеся завершення дочірнього процесу. Встановити та повернути атрибут returncode.

Якщо процес не завершується після тайм-ауту секунд, викличте виняток TimeoutExpired. Можна безпечно перехопити цей виняток і повторити очікування.

Примітка

Це призведе до взаємоблокування під час використання stdout=PIPE або stderr=PIPE, і дочірній процес генерує достатню кількість виводу в канал, щоб блокувати очікування, поки буфер каналу ОС прийме більше даних. Використовуйте Popen.communicate() під час використання каналів, щоб уникнути цього.

Примітка

The function is implemented using a busy loop (non-blocking call and short sleeps). Use the asyncio module for an asynchronous wait: see asyncio.create_subprocess_exec.

Змінено в версії 3.3: Додано тайм-аут.

Popen.communicate(input=None, timeout=None)

Взаємодія з процесом: надсилання даних на stdin. Читання даних із stdout і stderr, доки не буде досягнуто кінця файлу. Зачекайте, поки процес завершиться, і встановіть атрибут returncode. Додатковий аргумент input має бути даними, які надсилаються дочірньому процесу, або None, якщо дані не повинні надсилатися дочірньому процесу. Якщо потоки були відкриті в текстовому режимі, введення має бути рядком. В іншому випадку це повинні бути байти.

communicate() повертає кортеж (stdout_data, stderr_data). Дані будуть рядками, якщо потоки були відкриті в текстовому режимі; інакше, байти.

Зауважте, що якщо ви хочете надіслати дані на стандартний вхід процесу, вам потрібно створити об’єкт Popen за допомогою stdin=PIPE. Подібним чином, щоб отримати щось інше, окрім None у кортежі результатів, вам також потрібно вказати stdout=PIPE та/або stderr=PIPE.

Якщо процес не завершиться після тайм-ауту секунд, буде викликано виняток TimeoutExpired. Перехоплення цього винятку та повторна спроба зв’язку не призведуть до втрати вихідних даних.

Дочірній процес не вимикається, якщо закінчується час очікування, тому, щоб правильно очистити програму, яка добре працює, слід вбити дочірній процес і завершити зв’язок:

proc = subprocess.Popen(...)
try:
    outs, errs = proc.communicate(timeout=15)
except TimeoutExpired:
    proc.kill()
    outs, errs = proc.communicate()

Примітка

Зчитані дані буферизуються в пам’яті, тому не використовуйте цей метод, якщо розмір даних великий або необмежений.

Змінено в версії 3.3: Додано тайм-аут.

Popen.send_signal(signal)

Посилає сигнал сигнал дитині.

Нічого не робити, якщо процес завершено.

Примітка

On Windows, SIGTERM is an alias for terminate(). CTRL_C_EVENT and CTRL_BREAK_EVENT can be sent to processes started with a creationflags parameter which includes CREATE_NEW_PROCESS_GROUP.

Popen.terminate()

Stop the child. On POSIX OSs the method sends SIGTERM to the child. On Windows the Win32 API function TerminateProcess() is called to stop the child.

Popen.kill()

Вбиває дитину. В ОС POSIX функція надсилає SIGKILL дочірньому. У Windows kill() є псевдонімом для terminate().

The following attributes are also available:

Popen.args

Аргумент args, як його було передано до Popen – послідовність аргументів програми або один рядок.

Нове в версії 3.3.

Popen.stdin

If the stdin argument was PIPE, this attribute is a writeable stream object as returned by open(). If the encoding or errors arguments were specified or the universal_newlines argument was True, the stream is a text stream, otherwise it is a byte stream. If the stdin argument was not PIPE, this attribute is None.

Popen.stdout

If the stdout argument was PIPE, this attribute is a readable stream object as returned by open(). Reading from the stream provides output from the child process. If the encoding or errors arguments were specified or the universal_newlines argument was True, the stream is a text stream, otherwise it is a byte stream. If the stdout argument was not PIPE, this attribute is None.

Popen.stderr

If the stderr argument was PIPE, this attribute is a readable stream object as returned by open(). Reading from the stream provides error output from the child process. If the encoding or errors arguments were specified or the universal_newlines argument was True, the stream is a text stream, otherwise it is a byte stream. If the stderr argument was not PIPE, this attribute is None.

Попередження

Використовуйте communicate() замість .stdin.write, .stdout.read або .stderr.read, щоб уникнути взаємоблокувань через будь-які інших буферів каналів ОС, які заповнюються та блокують дочірній процес.

Popen.pid

Ідентифікатор дочірнього процесу.

Зауважте, що якщо ви встановите для аргументу shell значення True, це буде ідентифікатор процесу створеної оболонки.

Popen.returncode

The child return code, set by poll() and wait() (and indirectly by communicate()). A None value indicates that the process hasn’t terminated yet.

Від’ємне значення -N вказує на те, що дочірній елемент було завершено сигналом N (лише POSIX).

Windows Open Helpers

Клас STARTUPINFO і наступні константи доступні лише в Windows.

class subprocess.STARTUPINFO(*, dwFlags=0, hStdInput=None, hStdOutput=None, hStdError=None, wShowWindow=0, lpAttributeList=None)

Часткова підтримка структури Windows STARTUPINFO використовується для створення Popen. Наступні атрибути можна встановити, передавши їх як аргументи лише для ключових слів.

Змінено в версії 3.7: Додано підтримку аргументів лише за ключовими словами.

dwFlags

Бітове поле, яке визначає, чи використовуються певні атрибути STARTUPINFO, коли процес створює вікно.

si = subprocess.STARTUPINFO()
si.dwFlags = subprocess.STARTF_USESTDHANDLES | subprocess.STARTF_USESHOWWINDOW
hStdInput

Якщо dwFlags визначає STARTF_USESTDHANDLES, цей атрибут є стандартним дескриптором введення для процесу. Якщо STARTF_USESTDHANDLES не вказано, за умовчанням для стандартного введення є буфер клавіатури.

hStdOutput

Якщо dwFlags визначає STARTF_USESTDHANDLES, цей атрибут є стандартним дескриптором виводу для процесу. В іншому випадку цей атрибут ігнорується, а за замовчуванням для стандартного виведення буде буфер вікна консолі.

hStdError

Якщо dwFlags визначає STARTF_USESTDHANDLES, цей атрибут є стандартним описом помилки для процесу. В іншому випадку цей атрибут ігнорується, а стандартною помилкою за замовчуванням є буфер вікна консолі.

wShowWindow

Якщо dwFlags визначає STARTF_USESHOWWINDOW, цей атрибут може бути будь-яким із значень, які можна вказати в параметрі nCmdShow для функції ShowWindow, за винятком SW_SHOWDEFAULT. В іншому випадку цей атрибут ігнорується.

SW_HIDE передбачено для цього атрибута. Він використовується, коли Popen викликається з shell=True.

lpAttributeList

Словник додаткових атрибутів для створення процесу, наведений у STARTUPINFOEX, див. UpdateProcThreadAttribute.

Підтримувані атрибути:

handle_list

Послідовність дескрипторів, які будуть успадковані. close_fds має бути істинним, якщо воно не порожнє.

os.set_handle_inheritable() під час передачі в конструктор Popen дескрипторів має бути тимчасово успадкованим, інакше OSError буде викликано помилкою Windows ERROR_INVALID_PARAMETER (87).

Попередження

У багатопотоковому процесі будьте обережні, щоб уникнути витоку дескрипторів, позначених як успадковані, коли поєднуєте цю функцію з одночасними викликами інших функцій створення процесу, які успадковують усі дескриптори, наприклад os.system(). Це також стосується стандартного перенаправлення дескрипторів, яке тимчасово створює успадковані дескриптори.

Нове в версії 3.7.

Константи Windows

Модуль subprocess надає такі константи.

subprocess.STD_INPUT_HANDLE

Стандартний пристрій введення. Спочатку це буфер введення консолі, CONIN$.

subprocess.STD_OUTPUT_HANDLE

Стандартний пристрій виведення. Спочатку це активний буфер екрана консолі, CONOUT$.

subprocess.STD_ERROR_HANDLE

Пристрій стандартної помилки. Спочатку це активний буфер екрана консолі, CONOUT$.

subprocess.SW_HIDE

Приховує вікно. Буде активовано інше вікно.

subprocess.STARTF_USESTDHANDLES

Вказує, що атрибути STARTUPINFO.hStdInput, STARTUPINFO.hStdOutput і STARTUPINFO.hStdError містять додаткову інформацію.

subprocess.STARTF_USESHOWWINDOW

Вказує, що атрибут STARTUPINFO.wShowWindow містить додаткову інформацію.

subprocess.CREATE_NEW_CONSOLE

Новий процес має нову консоль замість успадкування батьківської консолі (за замовчуванням).

subprocess.CREATE_NEW_PROCESS_GROUP

Параметр Popen creationflags, щоб вказати, що буде створено нову групу процесів. Цей прапорець необхідний для використання os.kill() у підпроцесі.

Цей прапорець ігнорується, якщо вказано CREATE_NEW_CONSOLE.

subprocess.ABOVE_NORMAL_PRIORITY_CLASS

Параметр Popen creationflags, щоб вказати, що новий процес матиме пріоритет вище середнього.

Нове в версії 3.7.

subprocess.BELOW_NORMAL_PRIORITY_CLASS

Параметр Popen creationflags, щоб вказати, що новий процес матиме пріоритет нижче середнього.

Нове в версії 3.7.

subprocess.HIGH_PRIORITY_CLASS

Параметр Popen creationflags, щоб вказати, що новий процес матиме високий пріоритет.

Нове в версії 3.7.

subprocess.IDLE_PRIORITY_CLASS

Параметр Popen creationflags, щоб вказати, що новий процес матиме неактивний (найнижчий) пріоритет.

Нове в версії 3.7.

subprocess.NORMAL_PRIORITY_CLASS

A Popen creationflags parameter to specify that a new process will have an normal priority. (default)

Нове в версії 3.7.

subprocess.REALTIME_PRIORITY_CLASS

Параметр Popen creationflags, щоб вказати, що новий процес матиме пріоритет у реальному часі. Ви майже ніколи не повинні використовувати REALTIME_PRIORITY_CLASS, оскільки це перериває системні потоки, які керують введенням даних миші, введенням даних з клавіатури та фоновим очищенням диска. Цей клас може підійти для програм, які «спілкуються» безпосередньо з обладнанням або виконують короткі завдання, які повинні мати обмежені перерви.

Нове в версії 3.7.

subprocess.CREATE_NO_WINDOW

Параметр Popen creationflags, щоб вказати, що новий процес не створюватиме вікно.

Нове в версії 3.7.

subprocess.DETACHED_PROCESS

Параметр Popen creationflags, щоб вказати, що новий процес не успадковуватиме батьківську консоль. Це значення не можна використовувати з CREATE_NEW_CONSOLE.

Нове в версії 3.7.

subprocess.CREATE_DEFAULT_ERROR_MODE

Параметр Popen creationflags, щоб вказати, що новий процес не успадковує режим помилки процесу, що викликає. Натомість новий процес отримує стандартний режим помилки. Ця функція особливо корисна для багатопоточних програм оболонки, які працюють із вимкненими серйозними помилками.

Нове в версії 3.7.

subprocess.CREATE_BREAKAWAY_FROM_JOB

Параметр Popen creationflags, щоб вказати, що новий процес не пов’язаний із завданням.

Нове в версії 3.7.

Старіший API високого рівня

До Python 3.5 ці три функції містили API високого рівня для підпроцесу. Тепер ви можете використовувати run() у багатьох випадках, але багато існуючого коду викликають ці функції.

subprocess.call(args, *, stdin=None, stdout=None, stderr=None, shell=False, cwd=None, timeout=None, **other_popen_kwargs)

Виконайте команду, описану args. Зачекайте, поки команда завершиться, а потім поверніть атрибут returncode.

Код, який потребує захоплення stdout або stderr, повинен використовувати замість цього run():

run(...).returncode

Щоб придушити stdout або stderr, укажіть значення DEVNULL.

Аргументи, наведені вище, є лише поширеними. Повний підпис функції такий самий, як і у конструктора Popen - ця функція передає всі надані аргументи, окрім timeout, безпосередньо до цього інтерфейсу.

Примітка

Не використовуйте stdout=PIPE або stderr=PIPE з цією функцією. Дочірній процес буде заблоковано, якщо він генерує достатньо вихідних даних у канал, щоб заповнити буфер каналу ОС, оскільки канали не зчитуються.

Змінено в версії 3.3: Додано тайм-аут.

Змінено в версії 3.9.17: Changed Windows shell search order for shell=True. The current directory and %PATH% are replaced with %COMSPEC% and %SystemRoot%\System32\cmd.exe. As a result, dropping a malicious program named cmd.exe into a current directory no longer works.

subprocess.check_call(args, *, stdin=None, stdout=None, stderr=None, shell=False, cwd=None, timeout=None, **other_popen_kwargs)

Виконати команду з аргументами. Дочекайтеся виконання команди. Якщо код повернення дорівнює нулю, тоді повертається, інакше викликається CalledProcessError. Об’єкт CalledProcessError матиме код повернення в атрибуті returncode. Якщо check_call() не вдалося запустити процес, він поширить викликану виняткову ситуацію.

Код, який потребує захоплення stdout або stderr, повинен використовувати замість цього run():

run(..., check=True)

Щоб придушити stdout або stderr, укажіть значення DEVNULL.

Аргументи, наведені вище, є лише поширеними. Повний підпис функції такий самий, як і у конструктора Popen - ця функція передає всі надані аргументи, окрім timeout, безпосередньо до цього інтерфейсу.

Примітка

Не використовуйте stdout=PIPE або stderr=PIPE з цією функцією. Дочірній процес буде заблоковано, якщо він генерує достатньо вихідних даних у канал, щоб заповнити буфер каналу ОС, оскільки канали не зчитуються.

Змінено в версії 3.3: Додано тайм-аут.

Змінено в версії 3.9.17: Changed Windows shell search order for shell=True. The current directory and %PATH% are replaced with %COMSPEC% and %SystemRoot%\System32\cmd.exe. As a result, dropping a malicious program named cmd.exe into a current directory no longer works.

subprocess.check_output(args, *, stdin=None, stderr=None, shell=False, cwd=None, encoding=None, errors=None, universal_newlines=None, timeout=None, text=None, **other_popen_kwargs)

Виконати команду з аргументами та повернути її результат.

Якщо код повернення був ненульовим, це викликає CalledProcessError. Об’єкт CalledProcessError матиме код повернення в атрибуті returncode і будь-який вивід в атрибуті output.

Це еквівалентно:

run(..., check=True, stdout=PIPE).stdout

Аргументи, наведені вище, є лише поширеними. Повний підпис функції здебільшого такий самий, як і run() - більшість аргументів передаються безпосередньо до цього інтерфейсу. Існує одне відхилення API від поведінки run(): передача input=None поводитиметься так само, як input=b'' (або input='', залежно від інших аргументів ), а не використовувати стандартний дескриптор файлу введення батьківського.

За замовчуванням ця функція повертатиме дані у вигляді закодованих байтів. Фактичне кодування вихідних даних може залежати від викликаної команди, тому декодування в текст часто потрібно виконувати на рівні програми.

Цю поведінку можна змінити, встановивши для text, encoding, errors або universal_newlines значення True, як описано в Часто використовувані аргументи і run().

Щоб також зафіксувати стандартну помилку в результаті, використовуйте stderr=subprocess.STDOUT:

>>> subprocess.check_output(
...     "ls non_existent_file; exit 0",
...     stderr=subprocess.STDOUT,
...     shell=True)
'ls: non_existent_file: No such file or directory\n'

Нове в версії 3.1.

Змінено в версії 3.3: Додано тайм-аут.

Змінено в версії 3.4: Додано підтримку аргументу ключового слова input.

Змінено в версії 3.6: Додано кодування та помилки. Перегляньте run() для деталей.

Нове в версії 3.7: текст додано як більш читабельний псевдонім для universal_newlines.

Змінено в версії 3.9.17: Changed Windows shell search order for shell=True. The current directory and %PATH% are replaced with %COMSPEC% and %SystemRoot%\System32\cmd.exe. As a result, dropping a malicious program named cmd.exe into a current directory no longer works.

Заміна старих функцій модулем subprocess

У цьому розділі «a стає b» означає, що b можна використовувати як заміну a.

Примітка

Усі функції «a» в цьому розділі виходять з ладу (більш-менш) тихо, якщо виконувану програму неможливо знайти; натомість заміни «b» викликають OSError.

Крім того, заміни за допомогою check_output() завершаться помилкою з CalledProcessError, якщо запитана операція створює ненульовий код повернення. Вихід все ще доступний як атрибут output викликаного винятку.

У наступних прикладах ми припускаємо, що відповідні функції вже імпортовано з модуля subprocess.

Заміна команди оболонки /bin/sh

output=$(mycmd myarg)

стає:

output = check_output(["mycmd", "myarg"])

Заміна оболонкового трубопроводу

output=$(dmesg | grep hda)

стає:

p1 = Popen(["dmesg"], stdout=PIPE)
p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE)
p1.stdout.close()  # Allow p1 to receive a SIGPIPE if p2 exits.
output = p2.communicate()[0]

Виклик p1.stdout.close() після запуску p2 важливий для того, щоб p1 отримував SIGPIPE, якщо p2 завершується перед p1.

Крім того, для довіреного введення власна підтримка конвеєра оболонки може використовуватися безпосередньо:

output=$(dmesg | grep hda)

стає:

output=check_output("dmesg | grep hda", shell=True)

Заміна os.system()

sts = os.system("mycmd" + " myarg")
# becomes
retcode = call("mycmd" + " myarg", shell=True)

Примітки:

  • Виклик програми через оболонку зазвичай не потрібен.

  • Повернене значення call() кодується інакше, ніж значення os.system().

  • Функція os.system() ігнорує сигнали SIGINT і SIGQUIT під час виконання команди, але абонент, що викликає, повинен робити це окремо, коли використовується модуль subprocess.

Більш реалістичний приклад виглядатиме так:

try:
    retcode = call("mycmd" + " myarg", shell=True)
    if retcode < 0:
        print("Child was terminated by signal", -retcode, file=sys.stderr)
    else:
        print("Child returned", retcode, file=sys.stderr)
except OSError as e:
    print("Execution failed:", e, file=sys.stderr)

Заміна сімейства os.spawn

Приклад P_NOWAIT:

pid = os.spawnlp(os.P_NOWAIT, "/bin/mycmd", "mycmd", "myarg")
==>
pid = Popen(["/bin/mycmd", "myarg"]).pid

Приклад P_WAIT:

retcode = os.spawnlp(os.P_WAIT, "/bin/mycmd", "mycmd", "myarg")
==>
retcode = call(["/bin/mycmd", "myarg"])

Векторний приклад:

os.spawnvp(os.P_NOWAIT, path, args)
==>
Popen([path] + args[1:])

Приклад середовища:

os.spawnlpe(os.P_NOWAIT, "/bin/mycmd", "mycmd", "myarg", env)
==>
Popen(["/bin/mycmd", "myarg"], env={"PATH": "/usr/bin"})

Заміна os.popen(), os.popen2(), os.popen3()

(child_stdin, child_stdout) = os.popen2(cmd, mode, bufsize)
==>
p = Popen(cmd, shell=True, bufsize=bufsize,
          stdin=PIPE, stdout=PIPE, close_fds=True)
(child_stdin, child_stdout) = (p.stdin, p.stdout)
(child_stdin,
 child_stdout,
 child_stderr) = os.popen3(cmd, mode, bufsize)
==>
p = Popen(cmd, shell=True, bufsize=bufsize,
          stdin=PIPE, stdout=PIPE, stderr=PIPE, close_fds=True)
(child_stdin,
 child_stdout,
 child_stderr) = (p.stdin, p.stdout, p.stderr)
(child_stdin, child_stdout_and_stderr) = os.popen4(cmd, mode, bufsize)
==>
p = Popen(cmd, shell=True, bufsize=bufsize,
          stdin=PIPE, stdout=PIPE, stderr=STDOUT, close_fds=True)
(child_stdin, child_stdout_and_stderr) = (p.stdin, p.stdout)

Обробка коду повернення перекладається наступним чином:

pipe = os.popen(cmd, 'w')
...
rc = pipe.close()
if rc is not None and rc >> 8:
    print("There were some errors")
==>
process = Popen(cmd, stdin=PIPE)
...
process.stdin.close()
if process.wait() != 0:
    print("There were some errors")

Replacing functions from the popen2 module

Примітка

Якщо аргумент cmd для функцій popen2 є рядком, команда виконується через /bin/sh. Якщо це список, команда виконується безпосередньо.

(child_stdout, child_stdin) = popen2.popen2("somestring", bufsize, mode)
==>
p = Popen("somestring", shell=True, bufsize=bufsize,
          stdin=PIPE, stdout=PIPE, close_fds=True)
(child_stdout, child_stdin) = (p.stdout, p.stdin)
(child_stdout, child_stdin) = popen2.popen2(["mycmd", "myarg"], bufsize, mode)
==>
p = Popen(["mycmd", "myarg"], bufsize=bufsize,
          stdin=PIPE, stdout=PIPE, close_fds=True)
(child_stdout, child_stdin) = (p.stdout, p.stdin)

popen2.Popen3 і popen2.Popen4 в основному працюють як subprocess.Popen, за винятком того, що:

  • Popen викликає виняток, якщо виконання не вдається.

  • Аргумент capturestderr замінюється на аргумент stderr.

  • Необхідно вказати stdin=PIPE і stdout=PIPE.

  • popen2 закриває всі дескриптори файлів за замовчуванням, але ви повинні вказати close_fds=True з Popen, щоб гарантувати таку поведінку на всіх платформах або попередніх версіях Python.

Застарілі функції виклику оболонки

Цей модуль також надає такі застарілі функції з модуля команд 2.x. Ці операції неявно викликають системну оболонку, і жодна з описаних вище гарантій безпеки та узгодженості обробки винятків не діє для цих функцій.

subprocess.getstatusoutput(cmd)

Повернення (код виходу, вихід) виконання cmd в оболонці.

Execute the string cmd in a shell with Popen.check_output() and return a 2-tuple (exitcode, output). The locale encoding is used; see the notes on Часто використовувані аргументи for more details.

Кінцевий символ нового рядка видаляється з результату. Код виходу для команди можна інтерпретувати як код повернення підпроцесу. Приклад:

>>> subprocess.getstatusoutput('ls /bin/ls')
(0, '/bin/ls')
>>> subprocess.getstatusoutput('cat /bin/junk')
(1, 'cat: /bin/junk: No such file or directory')
>>> subprocess.getstatusoutput('/bin/junk')
(127, 'sh: /bin/junk: not found')
>>> subprocess.getstatusoutput('/bin/kill $$')
(-15, '')

Availability: POSIX & Windows.

Змінено в версії 3.3.4: Додано підтримку Windows.

Тепер функція повертає (код виходу, вихід) замість (статус, вихід), як це було в Python 3.3.3 і попередніх версіях. код виходу має те саме значення, що й returncode.

subprocess.getoutput(cmd)

Вихідні дані (stdout і stderr) виконання cmd в оболонці.

Як getstatusoutput(), за винятком того, що код виходу ігнорується, а значення, що повертається, є рядком, що містить вихідні дані команди. Приклад:

>>> subprocess.getoutput('ls /bin/ls')
'/bin/ls'

Availability: POSIX & Windows.

Змінено в версії 3.3.4: Додано підтримку Windows

Примітки

Перетворення послідовності аргументів на рядок у Windows

У Windows послідовність args перетворюється на рядок, який можна проаналізувати за такими правилами (які відповідають правилам, які використовує середовище виконання MS C):

  1. Аргументи розділені пробілом, який є пробілом або табуляцією.

  2. Рядок, взятий у подвійні лапки, інтерпретується як один аргумент, незалежно від пробілу, що міститься в ньому. Рядок у лапках можна вставити в аргумент.

  3. Подвійні лапки, перед якими стоїть зворотна скісна риска, інтерпретуються як буквальні подвійні лапки.

  4. Зворотні косі риски інтерпретуються буквально, якщо вони не стоять безпосередньо перед подвійними лапками.

  5. Якщо зворотні похилі риски безпосередньо передують подвійним лапкам, кожна пара зворотних похилих рисок інтерпретується як буквальна зворотна похила риска. Якщо кількість зворотних скісних рисок непарна, остання зворотна скісна риска виходить із наступних подвійних лапок, як описано в правилі 3.

Дивись також

shlex

Модуль, який забезпечує функцію аналізу та екранування командних рядків.