Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # devplayer@gmail.com
- # 2011-Nov-15
- # recordimports.py
- # my Import Hook Hack in response to:
- # http://groups.google.com/group/comp.lang.python/browse_thread/thread/5a5d5c724f142eb5?hl=en
- # as an initial learning exercise
- # This code needs to come before any imports you want recorded
- # usually just once in the initial (main) module
- # Of course you can excluding the if __name__ == '__main__': demo code
- # barely tested:
- # only tested with modules that had no errors on import
- # did not need/use/expect/try reload()
- # ran with Python 2.7 on Win32
- # create two fake modules moda.py and modb.py and stick some imports in them
- '''
- Exerpt from PEP 302 -- New Import Hooks
- ...
- Motivation:
- - __import__ gets called even for modules that are already in
- sys.modules, which is almost never what you want, unless you're
- writing some sort of monitoring tool.
- Note the last two words.'''
- # =======================================================================
- # place to save Collected imports
- imported = []
- # save old __builtins__.__import__()
- __builtins__.__dict__['__old_import__'] = __builtins__.__dict__['__import__']
- # match __builtins__.__import__() function signature
- def __myimport(name, globals={}, locals={}, fromlist=[], level=-1):
- global imported
- # I don't know why this works.
- __name__ = locals['__name__']
- __file__ = locals['__file__']
- __package__ = locals['__package__']
- __doc__ = locals['__doc__']
- # call original __import__
- module = __builtins__.__old_import__(name, globals, locals, fromlist, level)
- # save import module name into namespace
- __builtins__.__dict__[name] = module
- tag = (name, __name__, __file__, __package__, module)
- # do not append duplicates
- if tag not in imported:
- imported.append( tag )
- return module
- # store the new __import__ into __builtins__
- __builtins__.__dict__['__import__'] = __myimport
- # erase unneed func name
- del __myimport
- # =======================================================================
- # demo
- if __name__ == '__main__':
- # import some random packages/modules
- import sys
- import moda # a test module that does some other imports
- import modb # a test module that does some imports
- from pprint import pprint
- # imported has name, __name__, __file__, __package__
- # show each import
- for n, __n, __f, __p, m in imported:
- print n
- print ' ', __n
- print ' ', __f
- print ' ', __p
- print
- del n, __n, __f, __p, m
- print 'recordimports.py'
- pprint(dir(), None, 4, 1)
- print
- print 'moda.py'
- pprint(dir(moda), None, 4, 1)
- print
- print 'modb.py'
- pprint(dir(modb), None, 4, 1)
- # print imported
- print
Add Comment
Please, Sign In to add comment