{"id":13448378,"url":"https://github.com/gorakhargosh/watchdog","last_synced_at":"2026-02-23T04:32:24.098Z","repository":{"id":37397035,"uuid":"1017451","full_name":"gorakhargosh/watchdog","owner":"gorakhargosh","description":"Python library and shell utilities to monitor filesystem events.","archived":false,"fork":false,"pushed_at":"2026-02-20T18:45:56.000Z","size":2292,"stargazers_count":7256,"open_issues_count":222,"forks_count":740,"subscribers_count":124,"default_branch":"master","last_synced_at":"2026-02-20T18:51:03.294Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"http://packages.python.org/watchdog/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/gorakhargosh.png","metadata":{"files":{"readme":"README.rst","changelog":"changelog.rst","contributing":null,"funding":".github/FUNDING.yml","license":"COPYING","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":"AUTHORS","dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"github":["BoboTiG"],"polar":"tiger-222"}},"created_at":"2010-10-23T12:00:17.000Z","updated_at":"2026-02-20T18:46:01.000Z","dependencies_parsed_at":"2024-01-02T20:08:08.309Z","dependency_job_id":"b6bf20d2-96e8-44c4-9574-f4d205e01995","html_url":"https://github.com/gorakhargosh/watchdog","commit_stats":{"total_commits":1430,"total_committers":159,"mean_commits":8.9937106918239,"dds":0.5251748251748252,"last_synced_commit":"439a4d7e209f15b1b87967e497deaeda499d07fb"},"previous_names":[],"tags_count":61,"template":false,"template_full_name":null,"purl":"pkg:github/gorakhargosh/watchdog","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gorakhargosh%2Fwatchdog","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gorakhargosh%2Fwatchdog/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gorakhargosh%2Fwatchdog/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gorakhargosh%2Fwatchdog/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/gorakhargosh","download_url":"https://codeload.github.com/gorakhargosh/watchdog/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gorakhargosh%2Fwatchdog/sbom","scorecard":{"id":441421,"data":{"date":"2025-08-11","repo":{"name":"github.com/gorakhargosh/watchdog","commit":"d197487fb6b51aef05569bea0554f3272cb79039"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":4.5,"checks":[{"name":"Code-Review","score":4,"reason":"Found 13/30 approved changesets -- score normalized to 4","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Maintained","score":5,"reason":"3 commit(s) and 3 issue activity found in the last 90 days -- score normalized to 5","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/build-and-publish.yml:1","Warn: no topLevel permission defined: .github/workflows/freethreading_tests.yml:1","Warn: no topLevel permission defined: .github/workflows/tests.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build-and-publish.yml:98: update your workflow using https://app.stepsecurity.io/secureworkflow/gorakhargosh/watchdog/build-and-publish.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build-and-publish.yml:102: update your workflow using https://app.stepsecurity.io/secureworkflow/gorakhargosh/watchdog/build-and-publish.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build-and-publish.yml:110: update your workflow using https://app.stepsecurity.io/secureworkflow/gorakhargosh/watchdog/build-and-publish.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build-and-publish.yml:124: update your workflow using https://app.stepsecurity.io/secureworkflow/gorakhargosh/watchdog/build-and-publish.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/build-and-publish.yml:133: update your workflow using https://app.stepsecurity.io/secureworkflow/gorakhargosh/watchdog/build-and-publish.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build-and-publish.yml:44: update your workflow using https://app.stepsecurity.io/secureworkflow/gorakhargosh/watchdog/build-and-publish.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build-and-publish.yml:48: update your workflow using https://app.stepsecurity.io/secureworkflow/gorakhargosh/watchdog/build-and-publish.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build-and-publish.yml:59: update your workflow using https://app.stepsecurity.io/secureworkflow/gorakhargosh/watchdog/build-and-publish.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build-and-publish.yml:70: update your workflow using https://app.stepsecurity.io/secureworkflow/gorakhargosh/watchdog/build-and-publish.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build-and-publish.yml:74: update your workflow using https://app.stepsecurity.io/secureworkflow/gorakhargosh/watchdog/build-and-publish.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build-and-publish.yml:87: update your workflow using https://app.stepsecurity.io/secureworkflow/gorakhargosh/watchdog/build-and-publish.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/freethreading_tests.yml:28: update your workflow using https://app.stepsecurity.io/secureworkflow/gorakhargosh/watchdog/freethreading_tests.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/freethreading_tests.yml:30: update your workflow using https://app.stepsecurity.io/secureworkflow/gorakhargosh/watchdog/freethreading_tests.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/tests.yml:20: update your workflow using https://app.stepsecurity.io/secureworkflow/gorakhargosh/watchdog/tests.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/tests.yml:23: update your workflow using https://app.stepsecurity.io/secureworkflow/gorakhargosh/watchdog/tests.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/tests.yml:74: update your workflow using https://app.stepsecurity.io/secureworkflow/gorakhargosh/watchdog/tests.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/tests.yml:77: update your workflow using https://app.stepsecurity.io/secureworkflow/gorakhargosh/watchdog/tests.yml/master?enable=pin","Warn: pipCommand not pinned by hash: .github/workflows/build-and-publish.yml:53","Warn: pipCommand not pinned by hash: .github/workflows/build-and-publish.yml:79","Warn: pipCommand not pinned by hash: .github/workflows/tests.yml:30","Warn: pipCommand not pinned by hash: .github/workflows/tests.yml:84","Info:   0 out of  15 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   2 third-party GitHubAction dependencies pinned","Info:   0 out of   4 pipCommand dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: Apache License 2.0: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Vulnerabilities","score":9,"reason":"1 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-3rq5-2g8h-59hc"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"Packaging","score":10,"reason":"packaging workflow detected","details":["Info: Project packages its releases by way of GitHub Actions.: .github/workflows/build-and-publish.yml:115"],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 15 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-19T05:39:50.359Z","repository_id":37397035,"created_at":"2025-08-19T05:39:50.360Z","updated_at":"2025-08-19T05:39:50.360Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29738079,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-23T02:24:00.660Z","status":"ssl_error","status_checked_at":"2026-02-23T02:22:56.087Z","response_time":90,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-07-31T05:01:43.830Z","updated_at":"2026-02-23T04:32:24.090Z","avatar_url":"https://github.com/gorakhargosh.png","language":"Python","funding_links":["https://github.com/sponsors/BoboTiG","https://polar.sh/tiger-222","https://www.patreon.com/mschoentgen"],"categories":["Python","Files","资源列表","File System Events Monitoring","文件","Data Format \u0026 I/O","文件操作","Windows \u0026 Programming","语言资源库","Hey, listen! 🧚‍♀️","Files [🔝](#readme)","File Manipulation","Awesome Python","File \u0026 Path Utilities"],"sub_categories":["文件","Snippets Manager","For Python","python","Files","HTTP Clients"],"readme":"Watchdog\n========\n\n|PyPI Version|\n|PyPI Status|\n|PyPI Python Versions|\n|GitHub Build Status|\n|GitHub License|\n\n.. tip::\n\n    Become **my boss** to help me work on this awesome software, and make the world better:\n\n   |Patreon|\n\nPython API and shell utilities to monitor file system events.\n\nWorks on 3.9+.\n\nExample API Usage\n-----------------\n\nA simple program that uses watchdog to monitor directories specified\nas command-line arguments and logs events generated:\n\n.. code-block:: python\n\n    import time\n\n    from watchdog.events import FileSystemEvent, FileSystemEventHandler\n    from watchdog.observers import Observer\n\n\n    class MyEventHandler(FileSystemEventHandler):\n        def on_any_event(self, event: FileSystemEvent) -\u003e None:\n            print(event)\n\n\n    event_handler = MyEventHandler()\n    observer = Observer()\n    observer.schedule(event_handler, \".\", recursive=True)\n    observer.start()\n    try:\n        while True:\n            time.sleep(1)\n    finally:\n        observer.stop()\n        observer.join()\n\nAlternatively, you can use the observer as a context manager for cleaner code:\n\n.. code-block:: python\n\n    import time\n\n    from watchdog.events import FileSystemEvent, FileSystemEventHandler\n    from watchdog.observers import Observer\n\n\n    class MyEventHandler(FileSystemEventHandler):\n        def on_any_event(self, event: FileSystemEvent) -\u003e None:\n            print(event)\n\n\n    event_handler = MyEventHandler()\n    observer = Observer()\n    observer.schedule(event_handler, \".\", recursive=True)\n\n    with observer:\n        while True:\n            time.sleep(1)\n\n\nShell Utilities\n---------------\n\nWatchdog comes with an *optional* utility script called ``watchmedo``.\nPlease type ``watchmedo --help`` at the shell prompt to\nknow more about this tool.\n\nHere is how you can log the current directory recursively\nfor events related only to ``*.py`` and ``*.txt`` files while\nignoring all directory events:\n\n.. code-block:: bash\n\n    watchmedo log \\\n        --patterns='**/*.py;**/*.txt' \\\n        --ignore-directories \\\n        --recursive \\\n        --verbose \\\n        .\n\nYou can use the ``shell-command`` subcommand to execute shell commands in\nresponse to events:\n\n.. code-block:: bash\n\n    watchmedo shell-command \\\n        --patterns='**/*.py;**/*.txt' \\\n        --recursive \\\n        --command='echo \"${watch_src_path}\"' \\\n        .\n\nPlease see the help information for these commands by typing:\n\n.. code-block:: bash\n\n    watchmedo [command] --help\n\n\nAbout ``watchmedo`` Tricks\n~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n``watchmedo`` can read ``tricks.yaml`` files and execute tricks within them in\nresponse to file system events. Tricks are actually event handlers that\nsubclass ``watchdog.tricks.Trick`` and are written by plugin authors. Trick\nclasses are augmented with a few additional features that regular event handlers\ndon't need.\n\nAn example ``tricks.yaml`` file:\n\n.. code-block:: yaml\n\n    tricks:\n    - watchdog.tricks.LoggerTrick:\n        patterns: [\"**/*.py\", \"**/*.js\"]\n    - watchmedo_webtricks.GoogleClosureTrick:\n        patterns: ['**/*.js']\n        hash_names: true\n        mappings_format: json                  # json|yaml|python\n        mappings_module: app/javascript_mappings\n        suffix: .min.js\n        compilation_level: advanced            # simple|advanced\n        source_directory: app/static/js/\n        destination_directory: app/public/js/\n        files:\n          index-page:\n          - app/static/js/vendor/jquery*.js\n          - app/static/js/base.js\n          - app/static/js/index-page.js\n          about-page:\n          - app/static/js/vendor/jquery*.js\n          - app/static/js/base.js\n          - app/static/js/about-page/**/*.js\n\nThe directory containing the ``tricks.yaml`` file will be monitored. Each trick\nclass is initialized with its corresponding keys in the ``tricks.yaml`` file as\narguments and events are fed to an instance of this class as they arrive.\n\nInstallation\n------------\nInstall from PyPI using ``pip``:\n\n.. code-block:: bash\n\n    $ python -m pip install -U watchdog\n\n    # or to install the watchmedo utility:\n    $ python -m pip install -U 'watchdog[watchmedo]'\n\nInstall from source:\n\n.. code-block:: bash\n\n    $ python -m pip install -e .\n\n    # or to install the watchmedo utility:\n    $ python -m pip install -e '.[watchmedo]'\n\n\nDocumentation\n-------------\n\nYou can browse the latest release documentation_ online.\n\nContribute\n----------\n\nFork the `repository`_ on GitHub and send a pull request, or file an issue\nticket at the `issue tracker`_. For general help and questions use\n`stackoverflow`_ with tag `python-watchdog`.\n\nCreate and activate your virtual environment, then::\n\n    python -m pip install tox\n    python -m tox [-q] [-e ENV]\n\nIf you are making a substantial change, add an entry to the \"Unreleased\" section\nof the `changelog`_.\n\nSupported Platforms\n-------------------\n\n* Linux 2.6 (inotify)\n* macOS (FSEvents, kqueue)\n* FreeBSD/BSD (kqueue)\n* Windows (ReadDirectoryChangesW with I/O completion ports;\n  ReadDirectoryChangesW worker threads)\n* OS-independent (polling the disk for directory snapshots and comparing them\n  periodically; slow and not recommended)\n\nNote that when using watchdog with kqueue, you need the\nnumber of file descriptors allowed to be opened by programs\nrunning on your system to be increased to more than the\nnumber of files that you will be monitoring. The easiest way\nto do that is to edit your ``~/.profile`` file and add\na line similar to::\n\n    ulimit -n 1024\n\nor::\n\n    ulimit -n unlimited\n\nThis is an inherent problem with kqueue because it uses\nfile descriptors to monitor files. That plus the enormous\namount of bookkeeping that watchdog needs to do in order\nto monitor file descriptors just makes this a painful way\nto monitor files and directories. In essence, kqueue is\nnot a very scalable way to monitor a deeply nested\ndirectory of files and directories with a large number of\nfiles.\n\nFree threaded support\n---------------------\n\n`watchdog` has support for being built and run under free-threaded CPython. However, a full thread safety audit has not been completed, in particular this affects the `macOS FSEvents` interface.\n\nAbout using watchdog with editors like Vim\n------------------------------------------\n\nVim does not modify files unless directed to do so.\nIt creates backup files and then swaps them in to replace\nthe files you are editing on the disk. This means that\nif you use Vim to edit your files, the on-modified events\nfor those files will not be triggered by watchdog.\nYou may need to configure Vim appropriately to disable\nthis feature.\n\n\nAbout using watchdog with CIFS\n------------------------------\n\nWhen you want to watch changes in CIFS, you need to explicitly tell watchdog to\nuse ``PollingObserver``, that is, instead of letting watchdog decide an\nappropriate observer like in the example above, do::\n\n    from watchdog.observers.polling import PollingObserver as Observer\n\n\nDependencies\n------------\n\n1. Python 3.9 or above.\n2. XCode_ (only on macOS when installing from sources)\n3. PyYAML_ (only for ``watchmedo``)\n\nLicensing\n---------\n\nWatchdog is licensed under the terms of the `Apache License, version 2.0`_.\n\n- Copyright 2018-2025 Mickaël Schoentgen \u0026 contributors\n- Copyright 2014-2018 Thomas Amland \u0026 contributors\n- Copyright 2012-2014 Google, Inc.\n- Copyright 2011-2012 Yesudeep Mangalapilly\n\nProject `source code`_ is available at Github. Please report bugs and file\nenhancement requests at the `issue tracker`_.\n\nWhy Watchdog?\n-------------\n\nToo many people tried to do the same thing and none did what I needed Python\nto do:\n\n* pnotify_\n* `unison fsmonitor`_\n* fsmonitor_\n* guard_\n* pyinotify_\n* `inotify-tools`_\n* jnotify_\n* treewatcher_\n* `file.monitor`_\n* pyfilesystem_\n\n.. links:\n.. _Yesudeep Mangalapilly: yesudeep@gmail.com\n.. _source code: https://github.com/gorakhargosh/watchdog\n.. _issue tracker: https://github.com/gorakhargosh/watchdog/issues\n.. _Apache License, version 2.0: https://www.apache.org/licenses/LICENSE-2.0\n.. _documentation: https://python-watchdog.readthedocs.io/\n.. _stackoverflow: https://stackoverflow.com/questions/tagged/python-watchdog\n.. _repository: https://github.com/gorakhargosh/watchdog\n.. _issue tracker: https://github.com/gorakhargosh/watchdog/issues\n.. _changelog: https://github.com/gorakhargosh/watchdog/blob/master/changelog.rst\n\n.. _PyYAML: https://www.pyyaml.org/\n.. _XCode: https://developer.apple.com/technologies/tools/xcode.html\n\n.. _pnotify: http://mark.heily.com/pnotify\n.. _unison fsmonitor: https://webdav.seas.upenn.edu/viewvc/unison/trunk/src/fsmonitor.py?view=markup\u0026pathrev=471\n.. _fsmonitor: https://github.com/shaurz/fsmonitor\n.. _guard: https://github.com/guard/guard\n.. _pyinotify: https://github.com/seb-m/pyinotify\n.. _inotify-tools: https://github.com/rvoicilas/inotify-tools\n.. _jnotify: http://jnotify.sourceforge.net/\n.. _treewatcher: https://github.com/jbd/treewatcher\n.. _file.monitor: https://github.com/pke/file.monitor\n.. _pyfilesystem: https://github.com/PyFilesystem/pyfilesystem\n\n.. |PyPI Version| image:: https://img.shields.io/pypi/v/watchdog.svg\n   :target: https://pypi.python.org/pypi/watchdog/\n.. |PyPI Status| image:: https://img.shields.io/pypi/status/watchdog.svg\n   :target: https://pypi.python.org/pypi/watchdog/\n.. |PyPI Python Versions| image:: https://img.shields.io/pypi/pyversions/watchdog.svg\n   :target: https://pypi.python.org/pypi/watchdog/\n.. |Github Build Status| image:: https://github.com/gorakhargosh/watchdog/workflows/Tests/badge.svg\n   :target: https://github.com/gorakhargosh/watchdog/actions?query=workflow%3ATests\n.. |GitHub License| image:: https://img.shields.io/github/license/gorakhargosh/watchdog.svg\n   :target: https://github.com/gorakhargosh/watchdog/blob/master/LICENSE\n.. |Patreon| image:: https://img.shields.io/badge/Patreon-F96854?style=for-the-badge\u0026logo=patreon\u0026logoColor=white\n   :target: https://www.patreon.com/mschoentgen\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgorakhargosh%2Fwatchdog","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgorakhargosh%2Fwatchdog","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgorakhargosh%2Fwatchdog/lists"}