======
.. image:: https://img.shields.io/pypi/v/hupper.svg :target: https://pypi.python.org/pypi/hupper
.. image:: https://github.com/Pylons/hupper/workflows/Build/test%20on%20Linux/badge.svg?branch=master :target: https://github.com/Pylons/hupper/actions?query=workflow%3A%22Build%2Ftest+on+Linux%22
.. image:: https://github.com/Pylons/hupper/workflows/Build/test%20on%20MacOS/badge.svg?branch=master :target: https://github.com/Pylons/hupper/actions?query=workflow%3A%22Build%2Ftest+on+MacOS%22
.. image:: https://github.com/Pylons/hupper/workflows/Build/test%20on%20Windows/badge.svg?branch=master :target: https://github.com/Pylons/hupper/actions?query=workflow%3A%22Build%2Ftest+on+Windows%22
.. image:: https://readthedocs.org/projects/hupper/badge/?version=latest :target: https://readthedocs.org/projects/hupper/?badge=latest :alt: 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.
Hupper can load any Python code similar to python -m <module>
by using the
hupper -m <module>
program.
.. code-block:: console
$ hupper -m myapp Starting monitor for PID 23982.
Start by defining an entry point for your process. This must be an importable
path in string format. For example, myapp.scripts.serve.main
.
.. code-block:: python
# 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)
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
.
Support Python 3.8 and 3.9.
Fix an issue with bare .pyc
files in the source folder causing unhandled
exceptions.
See https://github.com/Pylons/hupper/pull/69
Fix issues with using the Watchman file monitor on versions newer than
Watchman 4.9.0. This fix modifies hupper
to use Watchman's
watch-project
capabilities which also support reading the
.watchmanconfig
file to control certain properties of the monitoring.
See https://github.com/Pylons/hupper/pull/70
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.
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
site-packages
.
These were previously being ignored by the file monitor but should now
be tracked.
See https://github.com/Pylons/hupper/pull/61Support --shutdown-interval
on the hupper
CLI.
See https://github.com/Pylons/hupper/pull/56
Support --reload-interval
on the hupper
CLI.
See https://github.com/Pylons/hupper/pull/59
Do not choke when stdin is not a TTY while waiting for changes after a crash. For example, when running in Docker Compose. See https://github.com/Pylons/hupper/pull/58
KeyboardInterrupt
stacktrace when killing hupper
while waiting for a reload.hupper
can be forced to reload the worker
by pressing the ENTER
key in the terminal instead of waiting to change a
file.
See https://github.com/Pylons/hupper/pull/53reloader.watch_files
.
See https://github.com/Pylons/hupper/pull/52hupper
would go into a
restart loop instead of waiting for a code change.
See https://github.com/Pylons/hupper/pull/50On 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
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/46site-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/40Support 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
Added watchman support via hupper.watchman.WatchmanFileMonitor
.
This is the new preferred file monitor on systems supporting unix sockets.
See https://github.com/Pylons/hupper/pull/32
The hupper.watchdog.WatchdogFileMonitor
will now output some info
when it receives ulimit or other errors from watchdog
.
See https://github.com/Pylons/hupper/pull/33
Allow -q
and -v
cli options to control verbosity.
See https://github.com/Pylons/hupper/pull/33
Pass a logger
value to the hupper.interfaces.IFileMonitorFactory
.
This is an instance of hupper.interfaces.ILogger
and can be used by
file monitors to output errors and debug information.
See https://github.com/Pylons/hupper/pull/33
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
-w
on the CLI to watch custom file paths.
See https://github.com/Pylons/hupper/pull/28sys.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/27Pause briefly after receiving a SIGINT to allow the worker to kill itself. If it does not die then it is terminated. See https://github.com/Pylons/hupper/issues/11
Python 3.6 compatibility.
hupper -m <module>
. This is
equivalent to python -m
except will fully reload the process when files
change. See https://github.com/Pylons/hupper/pull/8glob
module. On Python 3.5+
this allows recursive globs using **
. Prior to this, the globbing is
more limited.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.
Fix package long description on PyPI.
Ensure that the stdin file handle is inheritable incase the "spawn" variant of multiprocessing is enabled.
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
.
Windows support!
Added support for watchdog <https://pypi.org/project/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.
Version | Tag | Published |
---|---|---|
1.10.3 | 2yrs ago | |
1.10.2 | 3yrs ago | |
1.10.1 | 3yrs ago | |
1.10 | 3yrs ago |