Многопоточное программирование и вызов внешних программ
Запуска многопоточного выполнения функции через 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("dir")
# ret - код завершения программы
# 0 - успешно, иначе ошибка
Вызов блокирующий - программа ждет завершения команды вызванной через os.system
.
Запуск с получением вывода
import subprocess
output = subprocess.check_output('ping 127.0.0.1 -n 6', encoding="cp866")
print(output)
Вызов блокирующий - программа ждет завершения команды вызванной через subprocess.check_output
.
Запуск без ожидания завершения
Метод subprocess.Popen
по умолчанию запускает процесс без ожидания завершения:
import subprocess
q = subprocess.Popen("ping 127.0.0.1 -n 6", shell=True)
while q.poll() is None:
print('waiting...')
sleep(1)
print("Finished with code", q.poll())
Что еще нужно знать о запуске внешних программ
- Если вы нажимаете Ctrl-C пока внешняя программа запущена через os.system, то этот сигнал уйдет ей, а не Python.
- Можно взаимодействовать с интерактивными консольными приложениями пока те запущены через
Popen
. В частности их можно принудительно завершить или прочитать вывод до завершения самой программы. - Большинство приложений с графическим интерфейсом в качестве первого и единственного аргумента принимают имя файла, который должен быть в них открыт.
mpext.txt · Последнее изменение: 2023/03/21 12:26 — root
Если не указано иное, содержимое этой вики предоставляется на условиях следующей лицензии: CC Attribution-Share Alike 4.0 International