اذهب إلى المحتوى

السؤال

نشر

لدي ملف log تتم كتابته بواسطة عملية أخرى وأريد أن أتابع التغييرات. في كل مرة يحدث تغيير، أود قراءة البيانات الجديدة لإجراء بعض المعالجة عليها. بدلًا من قراءة الملف كاملًا، حيث أن حجم الملف يزداد مع الوقت وتستغرق عملية قراءة الملف وقت أطول كل مرة.

كيف أقوم بمعرفة التغيرات التي تحدث على الملف فقط (يتم إضافة أسطر جديدة إلى الملف كل بضع ثواني)؟

Recommended Posts

  • 0
نشر

يمكننا استخدام fcntl والتي هي function provides for control over open files مجموعة دوال التي تؤمن التحكم بالملفات المفتوحة، تتم بتحديد اشارة حدث، مع دالة للتنفيذ عند حدوث تغير:

import time
import fcntl
import os
import signal
# مسار الملف
FNAME = "/HOME/TOTO/FILETOWATCH"
# الدالة التي تتنفذ عند حدث التغيير
def handler(signum, frame):
    print "File %s modified" % (FNAME,)
# ربط حدث التغيير بالدالة
signal.signal(signal.SIGIO, handler)
# فتح الملف
fd = os.open(FNAME,  os.O_RDONLY)
# ربط الملف مع الأحداث 
fcntl.fcntl(fd, fcntl.F_SETSIG, 0)
fcntl.fcntl(fd, fcntl.F_NOTIFY,
            fcntl.DN_MODIFY | fcntl.DN_CREATE | fcntl.DN_MULTISHOT)
# جعل الشيفرة تستمر لوقت طويل
while True:
    time.sleep(10000)

 

  • 1
نشر

يمكنك تثبيت pynotify وإستخدامها

pip install pyinotify

ويمكنك إستخدامها كالآتي

import pyinotify,subprocess
# الدالة الذي يتم إستدعائها عند تغير الملف
def onChange():
    print(changed)

wm = pyinotify.WatchManager()
wm.add_watch('log.txt', pyinotify.IN_MODIFY, onChange)
notifier = pyinotify.Notifier(wm)
notifier.loop()

 

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...