остановить поток Python в ожидании popen? - PullRequest
1 голос
/ 09 декабря 2011

У меня есть поток, который вызывает Popen, чтобы получить строку из утилиты командной строки.Эта функция командной строки не возвращается до тех пор, пока не будут получены очень и очень запаздывающие данные сети.Иногда это может занять несколько минут, иногда меньше секунды.

Если пользователь хочет, он может отменить ожидание этих данных.В этом случае, как правильно остановить поток?

class CommThread( threading.Thread ):

    def __init__(self):
        self.stdout = None
        self.stderr = None
        self.command = None
        threading.Thread.__init__(self)

    def run(self):
        if self.command is not None:
            p = Popen( self.command.split(), shell=False, stdout=PIPE, stderr=PIPE)
            self.stdout, self.stderr = p.communicate()

Ответы [ 2 ]

3 голосов
/ 09 декабря 2011

Вы можете завершить дочерний процесс, вызвав p.terminate().Это можно сделать из другого потока.

2 голосов
/ 09 декабря 2011

Используйте Popen.terminate () вот документ http://docs.python.org/library/subprocess.html

Ваш код должен быть таким:

def run(self):
    if self.command is not None:
        self.process = Popen( self.command.split(), shell=False, stdout=PIPE, stderr=PIPE)

def stop(self):
    if self.process is not None:
        self.process.terminate()

вы можете вызвать CommThread.stop () в других блоках кода

...