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