Skip to main content

Integrated process monitor for developing and reloading daemons.

Project description

https://img.shields.io/pypi/v/hupper.svg https://github.com/Pylons/hupper/workflows/Build/test%20on%20Linux/badge.svg?branch=master https://github.com/Pylons/hupper/workflows/Build/test%20on%20MacOS/badge.svg?branch=master https://github.com/Pylons/hupper/workflows/Build/test%20on%20Windows/badge.svg?branch=master Documentation Status

hupper is an integrated process monitor that will track changes to any imported Python files in sys.modules as well as custom paths. When files are changed the process is restarted.

Command-line Usage

Hupper can load any Python code similar to python -m <module> by using the hupper -m <module> program.

$ hupper -m myapp
Starting monitor for PID 23982.

API Usage

Start by defining an entry point for your process. This must be an importable path in string format. For example, myapp.scripts.serve.main.

# myapp/scripts/serve.py

import sys
import hupper
import waitress


def wsgi_app(environ, start_response):
    start_response('200 OK', [('Content-Type', 'text/plain')])
    yield b'hello'


def main(args=sys.argv[1:]):
    if '--reload' in args:
        # start_reloader will only return in a monitored subprocess
        reloader = hupper.start_reloader('myapp.scripts.serve.main')

        # monitor an extra file
        reloader.watch_files(['foo.ini'])

    waitress.serve(wsgi_app)

Acknowledgments

hupper is inspired by initial work done by Carl J Meyer and David Glick during a Pycon sprint and is built to be a more robust and generic version of Ian Bicking’s excellent PasteScript paste serve --reload and Pyramid’s pserve --reload.

1.10 (2020-02-18)

  • Handle a SIGTERM signal by forwarding it to the child process and gracefully waiting for it to exit. This should enable using hupper from within docker containers and other systems that want to control the reloader process.

    Previously the SIGTERM would shutdown hupper immediately, stranding the worker and relying on it to shutdown on its own.

    See https://github.com/Pylons/hupper/pull/65

  • Avoid acquiring locks in the reloader process’s signal handlers. See https://github.com/Pylons/hupper/pull/65

  • Fix deprecation warnings caused by using the imp module on newer versions of Python. See https://github.com/Pylons/hupper/pull/65

1.9.1 (2019-11-12)

1.9 (2019-10-14)

1.8.1 (2019-06-12)

  • Do not show the KeyboardInterrupt stacktrace when killing hupper while waiting for a reload.

1.8 (2019-06-11)

1.7 (2019-06-04)

1.6.1 (2019-03-11)

1.6 (2019-03-06)

  • On systems that support SIGKILL and SIGTERM (not Windows), hupper will now send a SIGKILL to the worker process as a last resort. Normally, a SIGINT (Ctrl-C) or SIGTERM (on reload) will kill the worker. If, within shutdown_interval seconds, the worker doesn’t exit, it will receive a SIGKILL. See https://github.com/Pylons/hupper/pull/48

  • Support a logger argument to hupper.start_reloader to override the default logger that outputs messages to sys.stderr. See https://github.com/Pylons/hupper/pull/49

1.5 (2019-02-16)

  • Add support for ignoring custom patterns via the new ignore_files option on hupper.start_reloader. The hupper cli also supports ignoring files via the -x option. See https://github.com/Pylons/hupper/pull/46

1.4.2 (2018-11-26)

  • Fix a bug prompting the “ignoring corrupted payload from watchman” message and placing the file monitor in an unrecoverable state when a change triggered a watchman message > 4096 bytes. See https://github.com/Pylons/hupper/pull/44

1.4.1 (2018-11-11)

1.4 (2018-10-26)

  • Ignore changes to any system / installed files. This includes mostly changes to any files in the stdlib and site-packages. Anything that is installed in editable mode or not installed at all will still be monitored. This drastically reduces the number of files that hupper needs to monitor. See https://github.com/Pylons/hupper/pull/40

1.3.1 (2018-10-05)

  • Support Python 3.7.

  • Avoid a restart-loop if the app is failing to restart on certain systems. There was a race where hupper failed to detect that the app was crashing and thus fell into its restart logic when the user manually triggers an immediate reload. See https://github.com/Pylons/hupper/pull/37

  • Ignore corrupted packets coming from watchman that occur in semi-random scenarios. See https://github.com/Pylons/hupper/pull/38

1.3 (2018-05-21)

1.2 (2018-05-01)

  • Track only Python source files. Previously hupper would track all pyc and py files. Now, if a pyc file is found then the equivalent source file is searched and, if found, the pyc file is ignored. See https://github.com/Pylons/hupper/pull/31

  • Allow overriding the default monitor lookup by specifying the HUPPER_DEFAULT_MONITOR environment variable as a Python dotted-path to a monitor factory. For example, HUPPER_DEFAULT_MONITOR=hupper.polling.PollingFileMonitor. See https://github.com/Pylons/hupper/pull/29

  • Backward-incompatible changes to the hupper.interfaces.IFileMonitorFactory API to pass arbitrary kwargs to the factory. See https://github.com/Pylons/hupper/pull/29

1.1 (2018-03-29)

1.0 (2017-05-18)

  • Copy sys.path to the worker process and ensure hupper is on the PYTHONPATH so that the subprocess can import it to start the worker. This fixes an issue with how zc.buildout injects dependencies into a process which is done entirely by sys.path manipulation. See https://github.com/Pylons/hupper/pull/27

0.5 (2017-05-10)

  • On non-windows systems ensure an exec occurs so that the worker does not share the same process space as the reloader causing certain code that is imported in both to not ever be reloaded. Under the hood this was a significant rewrite to use subprocess instead of multiprocessing. See https://github.com/Pylons/hupper/pull/23

0.4.4 (2017-03-10)

0.4.3 (2017-03-07)

0.4.2 (2017-01-24)

0.4.1 (2017-01-03)

  • Handle errors that may occur when using watchdog to observe non-existent folders.

0.4.0 (2017-01-02)

0.3.6 (2016-12-18)

  • Read the traceback for unknown files prior to crashing. If an import crashes due to a module-scope exception the file that caused the crash would not be tracked but this should help.

0.3.5 (2016-12-17)

  • Attempt to send imported paths to the monitor process before crashing to avoid cases where the master is waiting for changes in files that it never started monitoring.

0.3.4 (2016-11-21)

  • Add support for globbing using the stdlib glob module. On Python 3.5+ this allows recursive globs using **. Prior to this, the globbing is more limited.

0.3.3 (2016-11-19)

  • Fixed a runtime failure on Windows 32-bit systems.

0.3.2 (2016-11-15)

  • Support triggering reloads via SIGHUP when hupper detected a crash and is waiting for a file to change.

  • Setup the reloader proxy prior to importing the worker’s module. This should allow some work to be done at module-scope instead of in the callable.

0.3.1 (2016-11-06)

  • Fix package long description on PyPI.

  • Ensure that the stdin file handle is inheritable incase the “spawn” variant of multiprocessing is enabled.

0.3 (2016-11-06)

  • Disable bytecode compiling of files imported by the worker process. This should not be necessary when developing and it was causing the process to restart twice on Windows due to how it handles pyc timestamps.

  • Fix hupper’s support for forwarding stdin to the worker processes on Python < 3.5 on Windows.

  • Fix some possible file descriptor leakage.

  • Simplify the hupper.interfaces.IFileMonitor interface by internalizing some of the hupper-specific integrations. They can now focus on just looking for changes.

  • Add the hupper.interfaces.IFileMonitorFactory interface to improve the documentation for the callback argument required by hupper.interfaces.IFileMonitor.

0.2 (2016-10-26)

  • Windows support!

  • Added support for watchdog if it’s installed to do inotify-style file monitoring. This is an optional dependency and hupper will fallback to using polling if it’s not available.

0.1 (2016-10-21)

  • Initial release.

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

hupper-1.10.tar.gz (42.6 kB view details)

Uploaded Source

Built Distribution

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

hupper-1.10-py2.py3-none-any.whl (25.9 kB view details)

Uploaded Python 2Python 3

File details

Details for the file hupper-1.10.tar.gz.

File metadata

  • Download URL: hupper-1.10.tar.gz
  • Upload date:
  • Size: 42.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.1.1 pkginfo/1.5.0.1 requests/2.22.0 setuptools/45.2.0 requests-toolbelt/0.9.1 tqdm/4.41.1 CPython/3.7.4

File hashes

Hashes for hupper-1.10.tar.gz
Algorithm Hash digest
SHA256 dca527df8f5d770a02a8cd5e7612a5f0eb560ede6634bc4f56604fea0bcd1c16
MD5 29b3f40da78f14f2824bf802a8b7e781
BLAKE2b-256 e94302c39e0676b93c11b82316151f23d5e9ab0c2bb8633b156b7b7605e15ca8

See more details on using hashes here.

File details

Details for the file hupper-1.10-py2.py3-none-any.whl.

File metadata

  • Download URL: hupper-1.10-py2.py3-none-any.whl
  • Upload date:
  • Size: 25.9 kB
  • Tags: Python 2, Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.1.1 pkginfo/1.5.0.1 requests/2.22.0 setuptools/45.2.0 requests-toolbelt/0.9.1 tqdm/4.41.1 CPython/3.7.4

File hashes

Hashes for hupper-1.10-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 ae7989c433fd7efe21579c5e92f5cf42cf30964c139bee54f9917cfc3a4832c1
MD5 b219e0f6f624156b76cd2e89466ac8e4
BLAKE2b-256 77259de73a32b056027e340eead68e5594d6b518e2a3cfea1a0b7651475f1177

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