2009-11-05 3 views
1

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) 
+0

"가능하면 플랫폼 호출을 사용하거나 win32api를 가져오고 싶지 않습니다." 문서에 이것이 불가능하다고합니다. 정확한 주제에 대해 중복 질문이 있으시면 SO를 확인하십시오. http://stackoverflow.com/questions/1064335/in-python-2-5-how-do-i-kill-a-subprocess –

+0

@ S.Lott : 그는 "명시 적으로 win32 API를 호출"한다고 생각합니다. 이 경우 Popen.terminate는 Windows에서 간접적으로 호출하고 Linux에서는 Posix를 사용합니다. 그리고 당신이 언급 한 링크는 같은 문제처럼 보이지 않습니다. – RedGlyph

+0

@ThantiK : Windows에서 발생하는 오류는'shell = True'를 지정했기 때문에 발생했다고 생각합니다. 정말로 필요합니까? 'shell = False'로 바꾸면, 리눅스에서 제대로 돌아 가기 위해서는 프로세스 이름을 첫 번째 매개 변수로하여 목록에 인수를 지정해야한다는 것을 잊지 마십시오. – RedGlyph

답변

2

당신은 쉽게 같은 사소한 일을 수행하여 플랫폼에 독립적 인 전화를 걸 수 있습니다 :

try: 
    import win32 
    def kill(param): 
     # the code from S.Lotts link 
except ImportError: 
    def kill(param): 
     # the unix way 

기본적으로 파이썬에는 존재하지 않는 이유는 모르겠지만 파일 변경 알림과 같은 다른 영역에는 매우 비슷한 문제가 있습니다. 플랫폼 독립적 인 lib를 만드는 것이 어렵지 않습니다. 최소 승리 + 맥 + 리눅스). 오픈 소스이므로 직접 수정해야합니다. P

+0

그래, 사실 나도 당황 스러웠다. PID를 win/linux/osx에 전달하여 프로세스를 종료하는 표준 방법이 있어야합니다. – ThantiK

+0

Windows의 경우이 방법으로 인한 위험은 쉘 프로세스가 아니라 쉘 프로세스를 죽일 것이라는 것입니다. stdin/out/err 용 콘솔은 충돌을 일으 킵니다. 바로 그것이 내 시스템에서 관찰 한 것입니다. 즉, 하위 프로세스가 셸 대신 상위 탐색기로 전환하고 리소스를 소비하고 차단할 수 있습니다. 결론 : 프로세스를 죽여야 만한다면'shell = True'를 사용하지 마십시오. – RedGlyph

+0

다시, 나는이 문제에 대해 선택의 여지가 없다. 실행중인 실행 파일을 콘솔없이 실행할 수 없습니다. 쉘을 false로 설정하면 __init_에 대한 모든 종류의 파이썬 오류가 발생합니다. – ThantiK

관련 문제