8 лет, да, а никто этого не понял? : /
Вы можете переопределить оператор import
или функцию __import__
.
Это всего лишь проверенный код писанины, потому что я не смог найти никакой законной ссылки:
import importlib
def secure_importer(name, globals=None, locals=None, fromlist=(), level=0):
if name != 'C': print(name, fromlist, level)
# not exactly a good verification layer
frommodule = globals['__name__'] if globals else None
if name == 'B' and frommodule != 'C':
raise ImportError("module '%s' is restricted."%name)
return importlib.__import__(name, globals, locals, fromlist, level)
__builtins__.__dict__['__import__'] = secure_importer
import C
и вот тесты для этого кода:
Python 3.4.3 |Anaconda 2.3.0 (32-bit)| (default, Mar 6 2015, 12:08:17) [MSC v.1600 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> ================================ RESTART ================================
>>>
B ('f',) 0
imported secure module
>>> from B import f
B ('f',) 0
linecache None 0
encodings.utf_8 ['*'] 0
Traceback (most recent call last):
File "<pyshell#0>", line 1, in <module>
from B import f
File "\home\tcll\Projects\python\test\restricted imports\main.py", line 11, in secure_importer
raise ImportError("module '%s' is restricted."%name)
ImportError: module 'B' is restricted.
>>> import C
>>>
Пожалуйста, не комментируйте меня, используя Python34, у меня есть свои причины, и это мой основной интерпретатор Linux специально для тестирования вещей (например, кода выше) для моего основного проекта.