Найти - Пользователи
Полная версия: Как узнай импортера?
Начало » Флейм » Как узнай импортера?
1 2 3
Пожарский
В твоем примере импортируемый модуль #samplemod.py а значит по условиям задачи если ЕГО импортируют то ОН и ТОЛЬКО ОН должен узнать (сам в себе) имя имтортера (скрипта который его импортирует), Скажем модуль ведет статистику кто и когда его вызывает…
Ты же запускаешь #main.py и в нем получаешь строку,,,
bialix
эта задача в общем виде не решается.
Пожарский
(
Андрей Светлов
Пожарский
В твоем примере импортируемый модуль #samplemod.py а значит по условиям задачи если ЕГО импортируют то ОН и ТОЛЬКО ОН должен узнать (сам в себе) имя имтортера (скрипта который его импортирует), Скажем модуль ведет статистику кто и когда его вызывает…
Ты же запускаешь #main.py и в нем получаешь строку,,,
Хорошо, лови

#imphook.py
import sys
import traceback as tb

import __builtin__

stnd_import = __builtin__.__import__

def my_import(name, globals, locals, from_list):
mod = stnd_import(name, globals, locals, from_list)
callback = getattr(stnd_import(name, globals, locals), ‘import_callback’, None)
if callback is not None:
callback(sys._getframe(1))
return mod

__builtin__.__import__ = my_import


#samplemod.py
'''Some module'''

def import_callback(frame):
code = frame.f_code
print code.co_name, code.co_filename, ‘:’, code.co_firstlineno


А здесть инсталируем hook и импортируем модуль samplemod

#main.py
import imphook

def f():
import samplemod

f()
Пожарский
) ты вероятно его не проганял;

File “/home/user/Desktop/imphook.py”, line 11, in my_import
callback(sys._getframe(1))
TypeError: ‘module’ object is not callable
Андрей Светлов
Пожарский
) ты вероятно его не проганял;

File “/home/user/Desktop/imphook.py”, line 11, in my_import
callback(sys._getframe(1))
TypeError: ‘module’ object is not callable
Сорри, поправил.
В пост не последний вариант попал
Пожарский
Спасибо, интересно. Но есть маленькое “не хорошо” наш модуль сможет узнать только те скрипты которые содержат import imphook. Все другие останутся им незамечены.
Андрей Светлов
Нет, неправда.
imphook нужно один раз проинсталлировать - и все.
Есть и более продвинутые способы писать import hooks:
PEP-302, только их описывать дольше и сложнее
Cleric
Можно обойтись и без хука:

import sys

iname = ‘'
try:
raise RuntimeError
except:
t,v,tb=sys.exc_info()
iname = tb.tb_frame.f_back.f_globals.get(’__name__','???')

sys.exc_clear()
print iname

правда главный модуль будет обозначатся как ‘__main__’
Андрей Светлов
Есть мелкая, но принципиальная разница.
Попробуй свой модуль дважды заимпортивовать.
Результат увидишь только один раз - первый.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB