Skip to main content

'A simple optionally-async python inotify library, focused on simplicity of use and operation, and leveraging modern Python features

Project description

An async python inotify package. Kept as simple and easy-to-understand as possible, while still being flexible and powerful. This is built on no external dependencies, and works through ctypes in a very obvious fashion.

This works without any other external dependencies.

The code is available on GitHub and the documentation is available on ReadTheDocs. The package itself is available on PyPi.

Installation

You know the drill:

pip install asyncinotify

Usage

The core of this package is asyncinotify.Inotify. Most important Classes may be imported directly from the asyncinotify package.

from pathlib import Path
from asyncinotify import Inotify, Mask
import asyncio

async def main():
    # Context manager to close the inotify handle after use
    with Inotify() as inotify:
        # Adding the watch can also be done outside of the context manager.
        # __enter__ doesn't actually do anything except return self.
        # This returns an asyncinotify.inotify.Watch instance
        inotify.add_watch('/tmp', Mask.ACCESS | Mask.MODIFY | Mask.OPEN | Mask.CREATE | Mask.DELETE | Mask.ATTRIB | Mask.CLOSE | Mask.MOVE | Mask.ONLYDIR)
        # Iterate events forever, yielding them one at a time
        async for event in inotify:
            # Events have a helpful __repr__.  They also have a reference to
            # their Watch instance.
            print(event)

            # the contained path may or may not be valid UTF-8.  See the note
            # below
            print(repr(event.path))

asyncio.run(main())

This will asynchronously watch the /tmp directory and report events it encounters.

This library also supports synchronous operation, using the asyncinotify.inotify.Inotify.sync_get` method, or simply using synchronous iteration.

Support

This is supported and tested on the following:

  • Python 3.6, 3.7, 3.8, 3.9, 3.10, 3.11, 3.12, 3.13, and 3.14

  • Debian bullseye, bookworm, and trixie

  • Ubuntu 20.04, 22.04, and 24.04

  • Fedora 42 and 43

  • Alma Linux 8, 9 and 10 (Should be equivalent to RHEL)

  • Alpine Linux 3.19 through 3.22

We regularly remove out-of-support OSes from the tests and add new releases.

We support back to Python 3.6 as long as it remains easy to do so. We may, in some future version, restrict Python support to non-EOL versions, if supporting the older versions becomes inconvenient.

Motivation

There are a few different python inotify packages. Most of them either have odd conventions, expose too much of the underlying C API in a way that I personally don’t like, are badly documented, they work with paths in a non-idiomatic way, are not asynchronous, or are overengineered compared to the API they are wrapping. I find that the last one is true for the majority of them.

I encourage everybody to read the sources of this package. They are quite simple and easy to understand.

This library

  • Works in a very simple way. It does not have many add-ons or extra features beyond presenting a very Python interface to the raw inotify functionality. Any extra features (such as recursive watching) are presented as completely separate classes. The core inotify functionality is as pure as it can reasonably be.

  • Grabs events in bulk and caches them for minor performance gains.

  • Leverages IntFlag for all masks and flags, allowing the user to use the features of IntFlag, such as seeing individual applied flags in the repr, checking for flag set bits with in.

  • Exposes all paths via python’s pathlib

  • Exposes all the functionality of inotify without depending on the user having to interact with any of the underlying mechanics of Inotify. You should never have to touch the inotify or watch descriptors for any reason.

The primary motivation is that this is written to be a Python inotify module that I would feel comfortable using.

License

This code is Copyright 2019 - 2023 Absolute Performance, Inc, and 2024 - 2025 ProCern Technology Solutions.

It is written and maintained by Taylor C. Richberger.

This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/.

Note that this does not have the Exhibit B - “Incompatible With Secondary Licenses” Notice. This software is explicitly compatible with secondary licenses. It is MPL 2.0 to ensure that any improvements and other changes are distributed. We do not want to inhibit nor prohibit its use with other FOSS or proprietary software, regardless of the license. In other words, if you aren’t changing asyncinotify, you can pretty much just use it as a library without worrying, unless your other license is explicitly or implicitly incompatible with it (which should be incredibly uncommon).

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

asyncinotify-4.3.2.tar.gz (30.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

asyncinotify-4.3.2-py3-none-any.whl (19.7 kB view details)

Uploaded Python 3

File details

Details for the file asyncinotify-4.3.2.tar.gz.

File metadata

  • Download URL: asyncinotify-4.3.2.tar.gz
  • Upload date:
  • Size: 30.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: python-requests/2.32.5

File hashes

Hashes for asyncinotify-4.3.2.tar.gz
Algorithm Hash digest
SHA256 3321deedc443c8402229a423623d3ae2fc17c433b9b9bfe170828ee0c7ea3871
MD5 4b5c24f9513c7431d4f371de4084eaac
BLAKE2b-256 c1ca6797a94d25ff7cc09dd1911fe8bf83fe5d2a94c767ba9ed53a1f980e60bf

See more details on using hashes here.

File details

Details for the file asyncinotify-4.3.2-py3-none-any.whl.

File metadata

  • Download URL: asyncinotify-4.3.2-py3-none-any.whl
  • Upload date:
  • Size: 19.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: python-requests/2.32.5

File hashes

Hashes for asyncinotify-4.3.2-py3-none-any.whl
Algorithm Hash digest
SHA256 5d2b3e3575b11996960224536d063ec92abd5189ede7e752e61e065bc4686983
MD5 ae3db35d2077674e0318859cea56ceea
BLAKE2b-256 0b0db70a02a97e402e81458b0cea6be3b32ea05be0e04246ddb3bd193eeeea27

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page