Форум сайта python.su
Всем доброго вот набрел на статью how to find a process by name in Windows using Python попробовал оттуда скрипт, но почему-то он выводится с ошибкой:
Traceback (most recent call last):
File "findprocess.py", line 20, in <module>
GetProcessID('pythonw.exe')
File "findprocess.py", line 4, in GetProcessID
items, instances = win32pdh.EnumObjectItems( None, None, object, win32pdh.PERF_DETAIL_WIZARD )
pywintypes.error: (-1073738824, 'EnumObjectItems for buffer size', '\xd3\xea\xe0\xe7\xe0\xed\xed\xfb\xe5 \xee\xe1\xfa\xe5\xea\xf2\xfb \xed\xe5 \xed\xe0\xe9\xe4\xe5\xed\xfb \xe2 \xf1\xe8\xf1\xf2\xe5\xec\xe5.')
Офлайн
Еще попутно хотел задать вопрос как при выведении ошибок избавиться от этого:
'\xd3\xea\xe0\xe7\xe0\xed\xed\xfb\xe5 \xee\xe1\xfa\xe5\xea\xf2\xfb \xed\xe5 \xed\xe0\xe9\xe4\xe5\xed\xfb \xe2 \xf1\xe8\xf1\xf2\xe5\xec\xe5.'
Насколько я понимаю там должен быть русский текст? Как его настроить. Если русского не бывает пускай будет английский.
Помогите?
Офлайн
Cover StoryПроблема в локализации.
Всем доброго вот набрел на статью how to find a process by name in Windows using Python попробовал оттуда скрипт, но почему-то он выводится с ошибкой:помогите найти причину. Файл со скриптом прилагается.Traceback (most recent call last):
File "findprocess.py", line 20, in <module>
GetProcessID('pythonw.exe')
File "findprocess.py", line 4, in GetProcessID
items, instances = win32pdh.EnumObjectItems( None, None, object, win32pdh.PERF_DETAIL_WIZARD )
pywintypes.error: (-1073738824, 'EnumObjectItems for buffer size', '\xd3\xea\xe0\xe7\xe0\xed\xed\xfb\xe5 \xee\xe1\xfa\xe5\xea\xf2\xfb \xed\xe5 \xed\xe0\xe9\xe4\xe5\xed\xfb \xe2 \xf1\xe8\xf1\xf2\xe5\xec\xe5.')
Офлайн
Спасибо, pyuser. Это для 2.4 А у меня 2.5.2 и pywin я качал 212 для 2.5.
Как вы думаете эта версия нормально будет работать c моим питоном. И как скачать его? Я что-то не пойму.
Офлайн
Cover StoryКонечно будет.
Спасибо, pyuser. Это для 2.4 А у меня 2.5.2 и pywin я качал 212 для 2.5.
Как вы думаете эта версия нормально будет работать c моим питоном.
Cover StoryЯ просто скопировал, а затем удалил номера строк :)
И как скачать его? Я что-то не пойму.
counter_english_map = {}
def find_pdh_counter_localized_name(english_name, machine_name = None):
if not counter_english_map:
import win32api, win32con
counter_reg_value = win32api.RegQueryValueEx(win32con.HKEY_PERFORMANCE_DATA, "Counter 009")
counter_list = counter_reg_value[0]
for i in range(0, len(counter_list) - 1, 2):
try:
counter_id = int(counter_list[i])
except ValueError:
continue
counter_english_map[counter_list[i+1].lower()] = counter_id
return win32pdh.LookupPerfNameByIndex(machine_name, counter_english_map[english_name.lower()])
object = "Process"
object = find_pdh_counter_localized_name("Process", None)
Офлайн
Спасибо, большое!
Ошибки исчезли, только почему-то не выходит номер процесса в моем примере, не могли бы вы помочь мне в этом а то я что-то не разберусь.
Файлик приложил.
Офлайн
Cover StoryОткровенно говоря я этим не пользуюсь, просто инет, google, Ваша ошибка и немного терпения. :)
Спасибо, большое!
Ошибки исчезли, только почему-то не выходит номер процесса в моем примере, не могли бы вы помочь мне в этом а то я что-то не разберусь.
Файлик приложил.
Отредактировано (Сен. 10, 2008 03:03:07)
Офлайн
Спасибо, pyuser! Ошибку нашел прилагаю рабочую версию своего скрипта. В принципе меня все устраивает, но если не сложно посмотрите пожалуйста скрипт, может его можно будет как-нибудь оптимизировать?
Офлайн
Cover StoryПеред тем как начинать оптимизировать нужно убедиться, что все правильно работает. С программированием на Python'е это мало связано, но тем не мене….
В принципе меня все устраивает, но если не сложно посмотрите пожалуйста скрипт, может его можно будет как-нибудь оптимизировать?
import os, sys
import threading
import win32process
import win32file, win32con, win32api
import pywintypes
from ctypes import windll, Structure, sizeof, byref
from ctypes import c_int, c_ulong, c_char
from ctypes import POINTER, WINFUNCTYPE
from time import sleep
#####################################################################################
TH32CS_SNAPHEAPLIST = 0x01L
TH32CS_SNAPPROCESS = 0x02L
TH32CS_SNAPTHREAD = 0x04L
TH32CS_SNAPMODULE = 0x08L
TH32CS_SNAPMODULE32 = 0x10L
TH32CS_SNAPALL = (TH32CS_SNAPHEAPLIST|TH32CS_SNAPPROCESS|TH32CS_SNAPTHREAD|TH32CS_SNAPMODULE)
TH32CS_INHERIT = 0x80000000
INVALID_HANDLE_VALUE = 0
ERROR_SUCCESS = 0
#####################################################################################
thelp_sema = threading.Semaphore()
#####################################################################################
## декларируем используемые функции WinAPI
CreateToolhelp32Snapshot = windll.kernel32.CreateToolhelp32Snapshot
Process32First = windll.kernel32.Process32First
Process32Next = windll.kernel32.Process32Next
GetCurrentProcessId = windll.kernel32.GetCurrentProcessId
OpenProcess = windll.kernel32.OpenProcess
TerminateProcess = windll.kernel32.TerminateProcess
WaitForSingleObject = windll.kernel32.WaitForSingleObject
EnumWindows = windll.user32.EnumWindows
IsWindowVisible = windll.user32.IsWindowVisible
GetDesktopWindow = windll.user32.GetDesktopWindow
PostMessage = windll.user32.PostMessageA
SendMessageTimeout = windll.user32.SendMessageTimeoutA
#####################################################################################
class PROCESSENTRY32 (Structure) :
_fields_ = [("dwSize", c_ulong),
("cntUsage", c_ulong),
("th32ProcessID", c_ulong),
("th32DefaultHeapID", c_ulong),
("th32ModuleID", c_ulong),
("cntThreads", c_ulong),
("th32ParentProcessID", c_ulong),
("pcPriClassBase", c_ulong),
("dwFlags", c_ulong),
("szexeFile", c_char * 260)]
class CSEARCH (Structure) :
_fields_ = [("pid", c_ulong),
("wnd", c_ulong)]
def GetProcessList () :
""" Возвращает список кортежей (Имя exe'шника, ID процесса, число потоков) """
pe32 = PROCESSENTRY32()
pe32.dwSize = sizeof(PROCESSENTRY32)
result = []
thelp_sema.acquire()
try :
snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)
flag = Process32First(snapshot, byref(pe32))
while flag :
result.append((pe32.szexeFile, pe32.th32ProcessID, pe32.cntThreads))
flag = Process32Next(snapshot, byref(pe32))
win32file.CloseHandle(snapshot)
finally :
thelp_sema.release()
return result
def StartProcess (path, params, work_dir, wait=0) :
""" запуск процесса, думаю имена параметров говорят сами за себя
wait - пауза перед запуском в секундах """
if wait : sleep(wait)
si = win32process.STARTUPINFO()
sa = pywintypes.SECURITY_ATTRIBUTES()
si.wShowWindow = win32con.SW_SHOWNORMAL
try :
hProcess, hThread, dwProcessId, dwThreadId = win32process.CreateProcess(
None, len(params) > 0 and path + " " + params or path,
sa, sa, True, win32con.NORMAL_PRIORITY_CLASS, None,
work_dir, si
)
except pywintypes.error, why :
raise Exception(why[2])
else :
win32file.CloseHandle(hProcess)
win32file.CloseHandle(hThread)
return dwProcessId
def __kill_process (pid) :
hProcess = OpenProcess(win32con.PROCESS_TERMINATE, False, pid)
result = TerminateProcess(hProcess, -1)
if result :
result = ERROR_SUCCESS
else :
result = win32api.GetLastError()
win32file.CloseHandle(hProcess)
return result
def __kill_process_tree (pid) :
pe32 = PROCESSENTRY32()
pe32.dwSize = sizeof(PROCESSENTRY32)
snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)
flag = Process32First(snapshot, byref(pe32))
while flag :
if pe32.th32ParentProcessID == pid :
__kill_process_tree(pe32.th32ProcessID)
pe32.dwSize = sizeof(PROCESSENTRY32)
flag = Process32Next(snapshot, byref(pe32))
win32file.CloseHandle(snapshot)
return __kill_process(pid)
def KillProcess (pid) :
""" тупое 'убийство' процесса и всех его дочерних процессов """
dwError = -1
thelp_sema.acquire()
try :
dwError = __kill_process_tree(pid)
finally :
thelp_sema.release()
if dwError == ERROR_SUCCESS :
return True, ""
else :
return False, win32api.FormatMessage(dwError)
def IsMainWindow (wnd) :
""" по хендлу окна определяем, является ли оно главным окном приложения """
parent = win32api.GetWindowLong(wnd, win32con.GWL_HWNDPARENT)
style = win32api.GetWindowLong(wnd, win32con.GWL_EXSTYLE)
return (parent == 0 or parent == GetDesktopWindow()) and \
((style & win32con.WS_EX_TOOLWINDOW) == 0 or (style & win32con.WS_EX_APPWINDOW) != 0)
def GetMainWndFromPid (pid) :
""" ищем главное окно по ID процесса"""
def enum_windows (wnd, sr) :
tid, pid = win32process.GetWindowThreadProcessId(wnd)
if pid == sr.contents.pid and IsMainWindow(wnd) :
sr.contents.wnd = wnd
return False
else : return True
CBF = WINFUNCTYPE(c_int, c_ulong, POINTER(CSEARCH))
EnumWindowsProc = CBF(enum_windows)
sr = CSEARCH()
sr.pid = pid
sr.wnd = 0
EnumWindows(EnumWindowsProc, byref(sr))
return sr.wnd
def IsWindowResponding (wnd, timeout) :
""" примитивная проверка "живучести" процесса """
result = c_ulong(0)
return SendMessageTimeout(wnd, win32con.WM_NULL, 0, 0,
win32con.SMTO_ABORTIFHUNG, timeout, byref(result)) != 0
def TerminateApplication (pid, timeout) :
""" Завершение работы процесса.
пытаемся корректно завершить работу, если не получается, тупо прибиваем """
def enum_windows (wnd, ppid) :
tid, pid = win32process.GetWindowThreadProcessId(wnd)
if pid == ppid :
PostMessage(wnd, win32con.WM_CLOSE, 0, 0)
return True
if pid == GetCurrentProcessId() : return False
result = False
hProcess = OpenProcess(win32con.SYNCHRONIZE | win32con.PROCESS_TERMINATE, False, pid)
if hProcess :
CBF = WINFUNCTYPE(c_int, c_ulong, c_ulong)
EnumWindowsProc = CBF(enum_windows)
try :
EnumWindows(EnumWindowsProc, pid)
except :
win32file.CloseHandle(hProcess)
return False
if WaitForSingleObject(hProcess, timeout) == win32con.WAIT_OBJECT_0 :
result = True
win32file.CloseHandle(hProcess)
if not result :
result, msg = KillProcess(pid)
return result
Офлайн
Спасибо, pyuser. Буду разбираться.
Офлайн