os independent way of seeing if an executable is on the path?
Jp Calderone
exarkun at divmod.com
Thu May 26 15:43:25 EDT 2005
On Thu, 26 May 2005 11:53:04 -0700, Don <donald.welch at nospam.hp.com> wrote:
>Steven Bethard wrote:
>
>> This has probably been answered before, but my Google skills have failed
>> me so far...
>>
>> Is there an os independent way of checking to see if a particular
>> executable is on the path? Basically what I want to do is run code like:
>> i, o, e = os.popen3(executable_name)
>> but I'd like to give an informative error if 'executable_name' doesn't
>> refer to an executable on the path.
>>
>> [snip]
>>
>> Thanks for the help,
>>
>> STeVe
>
>I wrote this 'which' function for Linux, but I think if you changed the ':'
>character, it would work on Windows (I think its a ';' on Windows, but I
>can't remember):
>
>def which( command ):
> path = os.getenv( 'PATH' ).split( ':' )
> found_path = ''
> for p in path:
> try:
> files = os.listdir( p )
> except:
> continue
> else:
> if command in files:
> found_path = p
> break
>
> return found_path
>
Here's the version that comes with Twisted:
import os, sys, imp
def which(name, flags=os.X_OK):
"""Search PATH for executable files with the given name.
@type name: C{str}
@param name: The name for which to search.
@type flags: C{int}
@param flags: Arguments to L{os.access}.
@rtype: C{list}
@param: A list of the full paths to files found, in the
order in which they were found.
"""
result = []
exts = filter(None, os.environ.get('PATHEXT', '').split(os.pathsep))
for p in os.environ['PATH'].split(os.pathsep):
p = os.path.join(p, name)
if os.access(p, flags):
result.append(p)
for e in exts:
pext = p + e
if os.access(pext, flags):
result.append(pext)
return result
Jp
More information about the Python-list
mailing list