Thắc mắc về bắt sự kiện trong python

Chào mn ạ, em đang học về python. thầy của em đang ra một đề đó là kiểm tra trạng thái tập tin đó. khi ai đó mở tập tin đó lên thì sẽ phát cảnh báo(không chỉnh sửa gì luôn ạ). Ai cho em gợi ý về cách check thời gian mở tập tin đi ạ. Em cảm ơn mn ạ.

Poll cái file đó thôi (tức là mở ra thử xong đóng lại và check error)

5 Likes

có thể giải thích rõ thêm giúp em không ạ @@ tại em cũng mới học python @@

Python standard library không có cho filesystem events.

1 là bạn có thể tạo vòng lặp kiểm tra lần cuối cùng file bị sửa, cách này chỉ phát hiện được khi file bị sửa chứ không phải khi được mở. Design pattern này có thể xem ở đây
2 là b có thể viết plugin bằng c/c++ bắt sự kiện filesystem events và wrapper cho Python, đã có thư viện là watchdog

Windows thì m mù tịt.

5 Likes

Em cảm ơn ạ, em có xem cái watchdog nhưng chỉ thấy nó cho bắt sự kiện, chỉnh sửa, xoá, đổi tên tập tin @@ khổ cái đề của thầy ghê @@

Có vẻ phức tạp và low-level hơn mình nghĩ.

Hiện tại m chỉ nghĩ được sử dụng api của inotify, ví dụ đơn giản có thể thử bằng inotify-tools

5 Likes

File đc mở bằng cái gì nhỉ? Trên hệ điều hành nào mỗi hệ điều hành có hệ thống file system api riêng.
p/s: https://stackoverflow.com/questions/11114492/check-if-a-file-is-not-open-not-used-by-other-process-in-python

import psutil

def has_handle(fpath):
    for proc in psutil.process_iter():
        try:
            for item in proc.open_files():
                if fpath == item.path:
                    return True
        except Exception:
            pass

    return False

Lib: https://pypi.org/project/psutil/

6 Likes

em cũng đang coi pyinotify ko biết nó là một với inotify hả bác ? @@

dạ mở bằng notepad bình thường thôi ạ, em đang học python cơ bản thôi ạ.

M ko sài windows nên ko test đc
Trên mac sài vscode mở file để test hàm kia thì ok nha

2 Likes

làm sao thế ạ, em có bạn sài mac :v

Bạn chạy vòng lặp với delay 200ms với hàm has_handle bên trên là đc mà.

4 Likes

Pyinotify là 1 wrapper của inotify.

Sử dụng filesytem event thì có vẻ phức tạp nhưng là event driven nên chắc scale tốt hơn, cách của @Dao_An là phù hợp nếu bạn không quan tâm nhiều đến performance.

5 Likes

Em cảm ơn các bác đã chỉ giúp em ạ :v em đã làm bằng cách dùng pyinotify, các bác cho em hỏi thêm cái sự kiện Close_NoWrite ý nghĩa của nó là sao ạ ? tại khi chạy thử pyinotify thì em chỉ mới mở tập tin lên thì nó hiện thông báo sự kiện Open_File và kèm theo cả cái Close_NoWrite, mn giúp em giải thích cái sự kiện này với ạ, em cảm ơn ạ.

https://linux.die.net/man/1/inotifywatch

A watched file or a file within a watched directory was closed, after being opened in read-only mode.

4 Likes

bác có thể giải thích rõ hơn cho em xíu được không ạ @@ em nghiệm nãy giờ vẫn chưa hiểu ra rõ ạ @@

Có thể ban đầu file được mở lên chỉ để đọc, sau khi chương trình thấy cần ghi đè lên thì mới đóng rồi mở lại để ghi.

5 Likes

em xin lỗi bác :frowning: nhưng thực sự em ko hiểu chỗ này ạ @@ bác cho em xin một ví dụ dc không ạ :frowning: em cảm ơn ạ.

Cho mình hỏi: Bạn mở tập tin bằng gì??

3 Likes

dạ em mở bằng Text Editor ạ

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?