Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/brettlangdon/importhook
Python package for executing functions when packages are imported
https://github.com/brettlangdon/importhook
hooks import module python python3
Last synced: 2 months ago
JSON representation
Python package for executing functions when packages are imported
- Host: GitHub
- URL: https://github.com/brettlangdon/importhook
- Owner: brettlangdon
- License: mit
- Created: 2018-08-24T11:50:49.000Z (over 6 years ago)
- Default Branch: master
- Last Pushed: 2023-04-14T22:22:00.000Z (over 1 year ago)
- Last Synced: 2024-10-12T22:44:43.758Z (3 months ago)
- Topics: hooks, import, module, python, python3
- Language: JavaScript
- Homepage: https://brettlangdon.github.io/importhook/
- Size: 198 KB
- Stars: 25
- Watchers: 4
- Forks: 4
- Open Issues: 4
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG
- License: LICENSE
Awesome Lists containing this project
README
Importhook
=========[![PyPI version](https://badge.fury.io/py/importhook.svg)](https://badge.fury.io/py/importhook)
`importhook` is a Python package that lets you configure functions to call whenever a specific module is imported.
## Installation
```bash
pip install importhook
```## Usage
Configure a hook to be called when `socket` module is imported.```python
import importhook# Setup hook to be called any time the `socket` module is imported and loaded into module cache
@importhook.on_import('socket')
def on_socket_import(socket):
print('"socket" module has been imported')# Import module
import socket
```You can also use `importhook` to intercept and modify a module on import by returning a Python module from your hook function.
```python
import importhook# Setup hook to be called any time the `socket` module is imported and loaded into module cache
@importhook.on_import('socket')
def on_socket_import(socket):
new_socket = importhook.copy_module(socket)
setattr(new_socket, 'gethostname', lambda: 'patched-hostname')
return new_socket# Import module
import socket# Prints: 'patched-hostname'
print(socket.gethostname())
````importhook` also comes with helpers to reload modules that have already been imported.
```python
import socket
import importhook# Setup hook to be called any time the `socket` module is imported and loaded into module cache
# DEV: `on_socket_import` will be called immediately because the `socket` module is already loaded
@importhook.on_import('socket')
def on_socket_import(socket):
print('"socket" module has been imported')# Reload the socket module
# DEV: Reassign to `socket` in case one of our hooks modifies the module
socket = importhook.reload_module(socket)
```
## Design decisions
### Overwriting sys.meta_path
If a Python developer wants to modify the import behavior they can do so by adding a new `importlib.abc.Finder`
class into `sys.meta_path`.```python
import sys# Add our custom `importlib.abc.Finder` to `sys.meta_path`
sys.meta_path.append(MyCustomFinder)
```One of the major design decisions we have taken with `importhook` is to wrap/overwrite `sys.meta_path`.
What it means is that `importhook` will continue to work as expected regardless of any other modifications of `sys.meta_path`.There is however one caveat, if you were to do `sys.meta_path = [MyCustomFinder] + sys.meta_path` then `sys.meta_path` will get
converted back into a `list`. Existing modifications to the finders in `sys.meta_path` will still work as expected, but any
new finders added will not get hooked.