跳转到主要内容

当导入特定模块时执行代码

项目描述

Importhook

PyPI version

importhook 是一个Python包,它允许您在导入特定模块时配置要调用的函数。

安装

pip install importhook

用法

配置一个钩子,在导入 socket 模块时调用。

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

您还可以使用 importhook 通过从您的钩子函数返回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 还附带了一些帮助程序,用于重新加载已导入的模块。

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)

设计决策

覆盖 sys.meta_path

如果Python开发者想要修改导入行为,他们可以通过将新的 importlib.abc.Finder 类添加到 sys.meta_path 来实现。

import sys

# Add our custom `importlib.abc.Finder` to `sys.meta_path`
sys.meta_path.append(MyCustomFinder)

我们在 importhook 中采取的一个主要设计决策是包装/覆盖 sys.meta_path。这意味着 importhook 将继续按预期工作,不管对 sys.meta_path 的任何其他修改。

但是有一个限制,如果您执行 sys.meta_path = [MyCustomFinder] + sys.meta_path,则 sys.meta_path 将被转换回一个 list。对 sys.meta_path 中查找器的现有修改将继续按预期工作,但添加的新查找器将不会被钩子。

项目详情


下载文件

下载您平台所需的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源分布

importhook-1.0.9.tar.gz (6.3 kB 查看哈希值)

上传时间

构建分布

importhook-1.0.9-py3-none-any.whl (7.9 kB 查看哈希值)

上传时间 Python 3

支持