42 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			42 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Python
		
	
	
	
| import os, sys
 | |
| from py.path import local
 | |
| from py.__.path.common import PathStr
 | |
| 
 | |
| def autopath(globs=None, basefile='__init__.py'):
 | |
|     """ return the (local) path of the "current" file pointed to by globals
 | |
|         or - if it is none - alternatively the callers frame globals.
 | |
| 
 | |
|         the path will always point to a .py file  or to None.
 | |
|         the path will have the following payload:
 | |
|         pkgdir   is the last parent directory path containing 'basefile'
 | |
|                  starting backwards from the current file.
 | |
|     """
 | |
|     if globs is None:
 | |
|         globs = sys._getframe(1).f_globals
 | |
|     try:
 | |
|         __file__ = globs['__file__']
 | |
|     except KeyError:
 | |
|         if not sys.argv[0]:
 | |
|             raise ValueError, "cannot compute autopath in interactive mode"
 | |
|         __file__ = os.path.abspath(sys.argv[0])
 | |
| 
 | |
|     custom__file__ = isinstance(__file__, PathStr)
 | |
|     if custom__file__:
 | |
|         ret = __file__.__path__
 | |
|     else:
 | |
|         ret = local(__file__)
 | |
|         if ret.ext in ('.pyc', '.pyo'):
 | |
|             ret = ret.new(ext='.py')
 | |
|     current = pkgdir = ret.dirpath()
 | |
|     while 1:
 | |
|         if basefile in current:
 | |
|             pkgdir = current
 | |
|             current = current.dirpath()
 | |
|             if pkgdir != current:
 | |
|                 continue
 | |
|         elif not custom__file__ and str(current) not in sys.path:
 | |
|             sys.path.insert(0, str(current))
 | |
|         break
 | |
|     ret.pkgdir = pkgdir
 | |
|     return ret
 |