الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

التاكد ان هناك برنامج يعمل

بدأه ekoo في 4 يوليو 2013 · 1 رد · 535 مشاهدة · في لغة Python
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

بغيت طريقة التاكد ان في برنامج شغال

 

بالبايثون

 

يعني مثلا اتاكد ان برنامج

 

firefox.exe

شغال او لا

#2

هذه أخي لايمكن عملها ببايثون مباشرة وبالمكتبات القياسية، يلزمك استخدام مكتبة خارجية أو استخدام دوال النظام، هذا مثال يستخدم دوال النظام -يعمل على ويندوز فقط- باستخدام 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

مواضيع مشابهة