你好,我想在自己的python副本中为自己实现一个小的库访问控制,我想知道是否有某种方法可以在导入系统上创建一个Hook,以便我的程序可以在每次导入时检查文件如果该程序有权导入该库,则进行此操作。 我看到了有关sys库和pep 302(https://www.python.org/dev/peps/pep-0302/)的信息,但我听不懂。
答案 0 :(得分:0)
您可以通过实现自己的自定义导入加载程序对象来更改模块的导入。您可以在这里找到文档的起点:https://docs.python.org/3/library/importlib.html
您需要做的是创建一个加载器,该加载器将对您要检查的包起作用,然后加载它们或引发所需的异常。如果模块不在您的访问控制列表中,则应返回None,这将使导入设备正常加载它们。我已经创建了此类功能的最小示例,您可以从中开始并扩展它以构建所需的功能。
import sys
import importlib
class ImportInterceptor(importlib.abc.Loader):
def __init__(self, package_permissions):
self.package_permissions = package_permissions
def find_module(self, fullname, path=None):
if fullname in self.package_permissions:
if self.package_permissions[fullname]:
return self
else:
raise ImportError("Package import was not allowed")
def load_module(self, fullname):
sys.meta_path = [x for x in sys.meta_path[1:] if x is not self]
module = importlib.import_module(fullname)
sys.meta_path = [self] + sys.meta_path
return module
if not hasattr(sys,'frozen'):
sys.meta_path = [ImportInterceptor({'textwrap': True, 'Pathlib': False})] + sys.meta_path
import textwrap
print(textwrap.dedent(' test'))
# Works fine
from pathlib import Path
# Raises exception
请注意,加载程序在加载程序包时会将其自身从sys.meta_path中删除。这是为了避免出现无限循环,该循环在每次尝试“实际”加载模块时都会不断调用自身。