.. TODO integrate this in commandref and configfile .. _packaging-command-hooks: ============= Command hooks ============= Packaging provides a way of extending its commands by the use of pre- and post-command hooks. Hooks are Python functions (or any callable object) that take a command object as argument. They're specified in :ref:`config files ` using their fully qualified names. After a command is finalized (its options are processed), the pre-command hooks are executed, then the command itself is run, and finally the post-command hooks are executed. See also global setup hooks in :ref:`setupcfg-spec`. .. _packaging-finding-hooks: Finding hooks ============= As a hook is configured with a Python dotted name, it must either be defined in a module installed on the system, or in a module present in the project directory, where the :file:`setup.cfg` file lives:: # file: _setuphooks.py def hook(install_cmd): metadata = install_cmd.dist.metadata print('Hooked while installing %r %s!' % (metadata['Name'], metadata['Version'])) Then you need to configure it in :file:`setup.cfg`:: [install_dist] pre-hook.a = _setuphooks.hook Packaging will add the project directory to :data:`sys.path` and find the ``_setuphooks`` module. Hooks defined in different config files (system-wide, user-wide and project-wide) do not override each other as long as they are specified with different aliases (additional names after the dot). The alias in the example above is ``a``.