def sysfind(cls, name, checker=None): |
""" return a path object found by looking at the systems |
underlying PATH specification. If the checker is not None |
it will be invoked to filter matching paths. If a binary |
cannot be found, None is returned |
Note: This is probably not working on plain win32 systems |
but may work on cygwin. |
""" |
if os.path.isabs(name): |
p = py.path.local(name) |
if p.check(file=1): |
return p |
else: |
if py.std.sys.platform == 'win32': |
paths = py.std.os.environ['Path'].split(';') |
try: |
systemroot = os.environ['SYSTEMROOT'] |
except KeyError: |
pass |
else: |
paths = [re.sub('%SystemRoot%', systemroot, path) |
for path in paths] |
tryadd = '', '.exe', '.com', '.bat' |
else: |
paths = py.std.os.environ['PATH'].split(':') |
tryadd = ('',) |
|
for x in paths: |
for addext in tryadd: |
-> p = py.path.local(x).join(name, abs=True) + addext |
try: |
if p.check(file=1): |
if checker: |
if not checker(p): |
continue |
return p |
except py.error.EACCES: |
pass |
return None |