Уведомления

Группа в Telegram: присоединиться | Jabber-конференция сообщества: pythonua@conference.jabber.ru

#1 Июнь 19, 2007 15:22:54

Пожарский
От:
Зарегистрирован: 2006-09-04
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

Как узнай импортера?

В твоем примере импортируемый модуль #samplemod.py а значит по условиям задачи если ЕГО импортируют то ОН и ТОЛЬКО ОН должен узнать (сам в себе) имя имтортера (скрипта который его импортирует), Скажем модуль ведет статистику кто и когда его вызывает…
Ты же запускаешь #main.py и в нем получаешь строку,,,



Офлайн

#2 Июнь 19, 2007 16:39:48

bialix
От:
Зарегистрирован: 2006-07-13
Сообщения: 774
Репутация: +  1  -
Профиль   Отправить e-mail  

Как узнай импортера?

эта задача в общем виде не решается.



Офлайн

#3 Июнь 19, 2007 16:53:03

Пожарский
От:
Зарегистрирован: 2006-09-04
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

Как узнай импортера?

(



Офлайн

#4 Июнь 19, 2007 17:38:44

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Как узнай импортера?

Пожарский
В твоем примере импортируемый модуль #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()



Отредактировано (Июнь 19, 2007 19:03:08)

Офлайн

#5 Июнь 19, 2007 18:56:39

Пожарский
От:
Зарегистрирован: 2006-09-04
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

Как узнай импортера?

) ты вероятно его не проганял;

File “/home/user/Desktop/imphook.py”, line 11, in my_import
callback(sys._getframe(1))
TypeError: ‘module’ object is not callable



Офлайн

#6 Июнь 19, 2007 19:02:16

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Как узнай импортера?

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

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



Офлайн

#7 Июнь 19, 2007 19:07:46

Пожарский
От:
Зарегистрирован: 2006-09-04
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

Как узнай импортера?

Спасибо, интересно. Но есть маленькое “не хорошо” наш модуль сможет узнать только те скрипты которые содержат import imphook. Все другие останутся им незамечены.



Офлайн

#8 Июнь 19, 2007 19:14:25

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Как узнай импортера?

Нет, неправда.
imphook нужно один раз проинсталлировать - и все.
Есть и более продвинутые способы писать import hooks:
PEP-302, только их описывать дольше и сложнее



Отредактировано (Июнь 20, 2007 01:56:20)

Офлайн

#9 Июнь 28, 2007 04:57:41

Cleric
От:
Зарегистрирован: 2007-06-26
Сообщения: 87
Репутация: +  0  -
Профиль   Отправить e-mail  

Как узнай импортера?

Можно обойтись и без хука:

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__’



Отредактировано (Июнь 28, 2007 04:58:47)

Офлайн

#10 Июнь 28, 2007 10:57:59

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Как узнай импортера?

Есть мелкая, но принципиальная разница.
Попробуй свой модуль дважды заимпортивовать.
Результат увидишь только один раз - первый.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version