Это старая версия документа!


Многопоточное программирование и вызов внешних программ

Запуска многопоточного выполнения функции через ThreadPoolExecutor

from time import sleep
from concurrent.futures import ThreadPoolExecutor

def work(i):
    sleep(1)
    return f'Task {i} is complete'

data = list(range(8))

results = []

with ThreadPoolExecutor(2) as executor:
    for result in executor.map(work, data):
        print(result)
        results.append(result)
        
print(results)

Исполнение внешних программ

Запуск с ожиданием завершения

Простейший метод запуска программы метод os.system:

import os

ret = os.system("ls -la")
# Программа ждет завершения команды
# вызванной через os.system

# Код возврата ret

Запуск без ожидания завершения

Метод subprocess.Popen по умолчанию запускает процесс без ожидания завершения:

import subprocess

subprocess.Popen(["long_time_process"])

Запуск с получением вывода

import subprocess

(exitcode, output) = subprocess.getstatusoutput('ls /bin/ls')

Что еще нужно знать о запуске внешних программ

  • Если вы нажимаете Ctrl-C пока внешняя программа запущена через os.system, то этот сигнал уйдет ей, а не Python.
  • Можно взаимодействовать с интерактивными консольными приложениями пока те запущены, но это не просто.
  • Большинство приложений с графическим интерфейсом в качестве первого и единственного аргумента принимают имя файла, который должен быть в них открыт.
  • Выполнить принудительное завершение запущенной внешней программы можно только в случае, если она запущена через Popen.