Подпроцесс Python: обратный вызов, когда cmd выходит

Я в настоящее время запускаю использование программы 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 существовать, я думал, что попытаюсь найти одно первое.

Заранее спасибо :)

52
задан Who 5 April 2010 в 12:45
поделиться

2 ответа

Вы правы - для этого нет хорошего 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.

61
ответ дан 7 November 2019 в 09:21
поделиться

Насколько мне известно, такого API нет, по крайней мере, в модуле подпроцесса . Скатывать что-то нужно самостоятельно, возможно, используя нитки.

0
ответ дан 7 November 2019 в 09:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: