السلام عليكم
بغيت طريقة التاكد ان في برنامج شغال
بالبايثون
يعني مثلا اتاكد ان برنامج
firefox.exe
شغال او لا
السلام عليكم
بغيت طريقة التاكد ان في برنامج شغال
بالبايثون
يعني مثلا اتاكد ان برنامج
firefox.exe
شغال او لا
هذه أخي لايمكن عملها ببايثون مباشرة وبالمكتبات القياسية، يلزمك استخدام مكتبة خارجية أو استخدام دوال النظام، هذا مثال يستخدم دوال النظام -يعمل على ويندوز فقط- باستخدام ctypes (مكتبة في بايثون تجعل بايثون مثل سي C):
# -*- coding: utf-8 -*-
#!python
# Public domain, Mr.B
from ctypes import *
from ctypes.wintypes import *
ULONG_PTR = c_ulong
CHAR = c_char
MAX_PATH = 260
TH32CS_SNAPPROCESS = 0x00000002
INVALID_HANDLE_VALUE = 0xffffffff
CreateToolhelp32Snapshot = windll.kernel32.CreateToolhelp32Snapshot
Process32First = windll.kernel32.Process32First
Process32Next = windll.kernel32.Process32Next
CloseHandle = windll.kernel32.CloseHandle
class PROCESSENTRY32(Structure):
_fields_ = [
('dwSize', DWORD),
('cntUsage', DWORD),
('th32ProcessID', DWORD),
('th32DefaultHeapID', ULONG_PTR),
('th32ModuleID', DWORD),
('cntThreads', DWORD),
('th32ParentProcessID', DWORD),
('pcPriClassBase', LONG),
('dwFlags', DWORD),
('szExeFile', CHAR * MAX_PATH)
]
def list_processes(callback):
if not hasattr(callback, '__call__'):
raise TypeError('argument must be callable')
hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)
if hSnapshot == INVALID_HANDLE_VALUE:
raise WindowsError('CreateToolhelp32Snapshot failed')
processentry32 = PROCESSENTRY32()
processentry32.dwSize = sizeof(PROCESSENTRY32)
if Process32First(hSnapshot, byref(processentry32)) == False:
CloseHandle(hSnapshot)
raise WindowsError('Process32First failed')
callback(processentry32)
while Process32Next(hSnapshot, byref(processentry32)) == True:
callback(processentry32)
CloseHandle(hSnapshot)
'''
*************************************************************
Example:
*************************************************************
'''
def mycallback(processentry32):
print(processentry32.szExeFile)
list_processes(mycallback)طريقة استخدامه أنك تستدعي الدالة list_processes وتمرر لها دالة (mycallback مثلاً)، الدالة list_processes ستستدعي دالتك mycallback وتمرر لها البنية PROCESSENTRY32، أحد عناصرها szExeFile الذي يحمل اسم العملية. المثال يطبع اسم العملية، لكن إذا أردت التحقق من أن العملية يمكنك تعديل mycallback إلى:
def mycallback(processentry32):
if processentry32.szExeFile == 'firefox.exe':
print('Firefox was found')المثال قد يحتوي دوال غريبة، فهذه دوال نظام وقد ولاتتعامل معها كما تتعامل مع بايثون، تلزمك معرفة في سي ودوال ويندوز، الا أنه يعتمد على ثلاث دوال:
CreateToolhelp32Snapshot: لآخذ "لقطة" للعمليات، سيعيد مقبض أو مؤشر أعتقد أنه داخلياً مؤشر لقائمة متصلة.
Process32First: ستأخذ أول عملية في تلك القائمة، مررنا لها المقبض الذي أخذناه من ومؤشر للبنية PROCESSENTRY32 التي تحمل معلومات العملية، تحتوي الحقل szExeFile وهو الذي يحمل اسم العملية (ماتبحث عنه)
وProcess32Next سيمررك على العمليات الباقية في هذه القائمة.
بالتوفيق
تم تعديل هذه المشاركة بواسطة Mr.B في 4 يوليو 2013 في 14:04