2012-06-15 3 views
4

나는 응용 프로그램을 실행하고 PID를 잡고, 그 프로세스 ID를 사용하여 발견이 더 이상 될 때까지 대기하지 파이썬 스크립트가 :Windows OS에서 Python으로 PID를 사용하여 실행중인 프로세스를 확인하는 방법은 무엇입니까?

result = subprocess.Popen(r'tasklist /fi "PID eq ' + str(PID) + '"', stdout=subprocess.PIPE, stderr=subprocess.STDOUT) 

I가 그것을 실행하려고 할 때까지이 나를 위해 잘 작동 물론 XP에는 tasklist.exe가 없습니다.

프로세스의 PID가 주어지면 프로세스가 실행 중인지 아닌지를 감지하는 또 다른 방법이 있습니까?

초기 프로세스가 실행되는 동안 다른 작업을 수행해야하므로 프로세스를 분리해야하므로 subprocess.Popen을 사용하여 프로세스를 시작하고 완료 될 때까지 기다리지 만합니다.

의견이 있으십니까?

+2

psutil 라이브러리를 파이썬에서 사용하고 psutil.pid_exists (pid)를 사용하여 프로세스가 실행 중인지 확인하십시오. 서브 프로세스 만 사용해야하는 경우가 아니면 – shobhit

+0

어떻게 사용 될지 예가 있습니까? – user1351549

+1

import psutil psutil.pid_exists (pid), pid가 있으면 true를 반환하고 그렇지 않으면 false를 반환합니다. – shobhit

답변

0

WMIC를 사용해 볼 수 있습니다. XP Home에서 사용 가능하다고 생각합니다. 다음 명령은 다음과 같습니다

wmic process get description,executablepath,processid 
+0

XP Home에서는 사용할 수 없습니다. – user1351549

2

당신이 the Python Win32 extensions를 설치 괜찮다면, 당신과 같이 종료 할 프로세스를 기다리 윈도우 API를 사용할 수 있습니다

from win32con import SYNCHRONIZE 
from win32event import WaitForSingleObject, INFINITE 
from win32api import OpenProcess, CloseHandle 

process_handle = OpenProcess(SYNCHRONIZE, False, pid) 
try: 
    WaitForSingleObject(process_handle, INFINITE) 
finally: 
    CloseHandle(process_handle) 

이가 코드의 원인이됩니다 프로세스가 종료 될 때까지 차단하십시오 (WaitForSingleObject() 값의 INFINITE은 원하는 경우 변경할 수 있으며, the documentation 참조).


또는 확장을 설치하지 않고, 당신이 kernel32.dll에 필요한 모든 방법이기 때문에 특히 쉽게 ctypes하여이 작업을 수행 할 수 있습니다 물론

from ctypes import windll 

SYNCHRONIZE = 0x100000L 
INFINITE = 0xFFFFFFFFL 

process_handle = windll.kernel32.OpenProcess(SYNCHRONIZE, 1, pid) 
windll.kernel32.WaitForSingleObject(process_handle, INFINITE) 
windll.kernel32.CloseHandle(process_handle) 

,이 경우, 오류 처리 코드 (생략 된) 조금 더 Pythonic 훨씬 더 복잡하고 훨씬 적습니다.

관련 문제