WindowsError: [Ошибка 5] Доступ запрещен при попытке убить подпроцесс (python)

Итак, у меня есть скрипт python, который запускает цикл, в котором он вызывает программу a через подпроцесс.Popen ждет его вывода, затем сохраняет вывод, а затем вызывает его снова и так далее. (Это происходит в течение нескольких запусков, которые я установил в качестве входных данных)

дело в том, что у меня есть таймер, так что всякий раз, когда программа A занимает больше, чем определенный threshold_time, скрипт убивает процесс с процессом.убить() и переходит к следующей итерации.

проблема что, хотя все, кажется, работает нормально даже для 300 запусков, иногда я получаю эту ошибку:

    File "C:Python27libsubprocess.py", line 1002, in terminate
    _subprocess.TerminateProcess(self._handle, 1)
    WindowsError: [Error 5] Access is denied

и затем скрипт умирает.

упомянутая часть скрипта:

timeout = TIME_CONST
for run in runs:
    killed = False
    start = time.clock()
    p = subprocess.Popen("SOME.CMD", cwd=r"some_dir") 
    # Monitor process. If it hits threshold, kill it and go to the next run
    while p.poll() is None:
        time.sleep(20) 
        secs_passed = time.clock() - start

        ### the following was my initial buggy line ###
        #if secs_passed >= timeout: 

        ### corrected line after jedislight's answer ###
        #if the time is over the threshold and process is still running, kill it
        if secs_passed >= timeout and p.poll is None: 
            p.kill()
            killed = True  
            break
    if killed: continue   

у вас есть какие-либо предложения чем проблема может быть?

EDIT: Принят ответ и исправлен код. Спасибо @jedislight за ваши отзывы!

1 ответов


вы не разделяющей вашу стр. опрос() и ваш P.убить() на 20 секунд. К тому времени процесс мог бы закончиться. Я бы предложил перенести время.сон (20) позвоните, чтобы опрос и убийство произошли в один и тот же период времени, чтобы избежать убийства мертвого процесса. Ниже приведен пример запуска в iPython, показывающий аналогичную ошибку при убийстве завершенного процесса:

In [2]: import subprocess

In [3]: p = subprocess.Popen("dir")

In [4]: p.poll()
Out[4]: 0

In [5]: p.kill()
---------------------------------------------------------------------------
WindowsError                              Traceback (most recent call last)

C:\Users\---\<ipython console> in <module>()

C:\Python26\lib\subprocess.pyc in terminate(self)
    947             """Terminates the process
    948             """
--> 949             _subprocess.TerminateProcess(self._handle, 1)
    950
    951         kill = terminate

WindowsError: [Error 5] Access is denied

даже если вы убиваете сразу после опроса, который показывает, что процессы запущены, он может закончиться до следующей строки выполненный. Я бы также предложил добавить блок try-catch для этого исключения, и если это произойдет, опрос снова, чтобы увидеть, действительно ли процесс завершен.