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