4

アプリケーションを起動し、PID を取得し、そのプロセス ID が見つからなくなるまで待機する Python スクリプトがあります。

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

もちろん、tasklist.exeを持たないXP Homeで実行しようとするまで、これは私にとってはうまくいきます

プロセスの PID を指定して、プロセスが実行されているかどうかを検出する別の方法はありますか。

最初のプロセスの実行中に他のタスクを実行する必要があるため、プロセスを切り離す必要があるため、単に subprocess.Popen でプロセスを起動して終了するのを待つことはできません。

何かご意見は?

4

2 に答える 2

2

Python Win32 拡張機能をインストールしてもかまわない場合は、Windows 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)

これにより、プロセスが終了するまでコードがブロックされます (必要に応じINFINITEWaitForSingleObject()値を変更できます。ドキュメントを参照してください)。


または、拡張機能をインストールせずに、 でこれを行うことができますctypes。必要なすべてのメソッドが に含まれているため、特に簡単ですkernel32.dll

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 ではありません。

于 2012-06-15T17:40:46.693 に答える
0

WMIC を使用してみてください。XP Homeで利用できると思います。コマンドは次のとおりです。

wmic process get description,executablepath,processid
于 2012-06-15T14:05:43.453 に答える