subprocess.Popen.terminate() 또는 kill() 명령으로 Windows에서 프로세스를 종료하려고하면 액세스가 거부되었습니다. 파일이 더 이상 존재하지 않으면 프로세스를 종료하는 크로스 플랫폼 방식이 정말로 필요합니다 (예, 내가하는 일을 수행하는 가장 우아한 방법이 아니라는 것을 알고 있습니다). 플랫폼 호출을 사용하지 않아도됩니다. 가능한 경우 win32api를 가져 오십시오.파이썬에서 프로세스를 종료하는 교차 플랫폼 방식
또한 작업을 종료하면 라이브러리의 해당 부분 반복 만 삭제할 수 있습니다. (내가 뭔가 작업과 작업을하면서 수정에 계획하는 경우 슬라이스를 사용하는 문제에 대해 뭔가를 읽고 기억?)
#/usr/bin/env python
#import sys
import time
import os
import subprocess
import platform
ServerRange = range(7878, 7890) #Range of ports you want your server to use.
cmd = 'VoiceChatterServer.exe'
#********DO NOT EDIT BELOW THIS LINE*******
def Start_IfConfExist(i):
if os.path.exists(str(i) + ".conf"):
Process[i] = subprocess.Popen(" " + cmd + " --config " + str(i) + ".conf", shell=True)
Process = {}
for i in ServerRange:
Start_IfConfExist(i)
while True:
for i in ServerRange:
if os.path.exists(str(i) + ".conf"):
res = Process[i].poll()
if not os.path.exists(str(i) + ".conf"): #This is the problem area
res = Process[i].terminate() #This is the problem area.
if res is not None:
Start_IfConfExist(i)
print "\nRestarting: " + str(i) + "\n"
time.sleep(1)
"가능하면 플랫폼 호출을 사용하거나 win32api를 가져오고 싶지 않습니다." 문서에 이것이 불가능하다고합니다. 정확한 주제에 대해 중복 질문이 있으시면 SO를 확인하십시오. http://stackoverflow.com/questions/1064335/in-python-2-5-how-do-i-kill-a-subprocess –
@ S.Lott : 그는 "명시 적으로 win32 API를 호출"한다고 생각합니다. 이 경우 Popen.terminate는 Windows에서 간접적으로 호출하고 Linux에서는 Posix를 사용합니다. 그리고 당신이 언급 한 링크는 같은 문제처럼 보이지 않습니다. – RedGlyph
@ThantiK : Windows에서 발생하는 오류는'shell = True'를 지정했기 때문에 발생했다고 생각합니다. 정말로 필요합니까? 'shell = False'로 바꾸면, 리눅스에서 제대로 돌아 가기 위해서는 프로세스 이름을 첫 번째 매개 변수로하여 목록에 인수를 지정해야한다는 것을 잊지 마십시오. – RedGlyph