Я в настоящее время запускаю использование программы subprocess.Popen(cmd, shell=TRUE)
Я довольно плохо знаком с Python, но это 'чувствует' как должен быть некоторый API, который позволяет мне сделать что-то подобное:
subprocess.Popen(cmd, shell=TRUE, postexec_fn=function_to_call_on_exit)
Я делаю это так, чтобы function_to_call_on_exit
может сделать что-то на основе знания, что cmd вышел (например, проведение подсчета количества внешних процессов, в настоящее время работающих)
Я предполагаю, что мог справедливо тривиально перенести подпроцесс в класс, который объединил поточную обработку с Popen.wait()
метод, но поскольку я еще не сделал поточной обработки в Python и кажется, что это могло бы быть достаточно свойственно API существовать, я думал, что попытаюсь найти одно первое.
Заранее спасибо :)
Вы правы - для этого нет хорошего API. Вы также правы в своем втором пункте - тривиально легко разработать функцию, которая делает это за вас, используя многопоточность.
import threading
import subprocess
def popenAndCall(onExit, popenArgs):
"""
Runs the given args in a subprocess.Popen, and then calls the function
onExit when the subprocess completes.
onExit is a callable object, and popenArgs is a list/tuple of args that
would give to subprocess.Popen.
"""
def runInThread(onExit, popenArgs):
proc = subprocess.Popen(*popenArgs)
proc.wait()
onExit()
return
thread = threading.Thread(target=runInThread, args=(onExit, popenArgs))
thread.start()
# returns immediately after the thread starts
return thread
Даже многопоточность довольно проста в Python, но обратите внимание, что если onExit() является вычислительно дорогим, вы захотите поместить это в отдельный процесс вместо использования многопроцессорной обработки (чтобы GIL не замедлял работу вашей программы). На самом деле это очень просто - вы можете просто заменить все вызовы к threading. Поток
с многопроцессорной обработкой. Process
, так как они следуют (почти) одному и тому же API.
Насколько мне известно, такого API нет, по крайней мере, в модуле подпроцесса
. Скатывать что-то нужно самостоятельно, возможно, используя нитки.