[Rob Wolfe] | Hari Sekhon wrote: | > I am writing a wrapper to a binary command to run it and then do | > something with the xml output from it. | > | > What is the best way of making sure that the command is | installed on the | > system before I try to execute it, like the python equivalent of the | > unix command "which"? | > | > Otherwise I'd have to do something like: | > | > if os.system('which somecommand') != 0: | > print "you don't have %s installed" % somecommand | > sys.exit(1) | > | > I know that isn't portable which is why a python solution would be | > better (although this will run on unix anyway, but it'd be | nice if it | > ran on windows too). | | IMHO this is pretty portable: | | >>> def is_on_path(fname): | ... for p in os.environ['PATH'].split(os.pathsep): | ... if os.path.isfile(os.path.join(p, fname)): | ... return True | ... return False |
Depends on how "fname" is specified: on Win32, the filename itself will have one of the PATHEXT extensions, even though you conventionally don't specify it (and if you're after portability you certainly won't). On *nix, tho', you almost certainly won't have the extension. As it happens I wrote a script similar to yours this morning which takes account of the PATHEXT, but because of that, it's obviously win-specific. Maybe it could be made a bit smarter to account for the possible absence of the env var. (This is a cut-down version) <code> import os, sys class x_finished (Exception): pass paths = ["."] + os.environ.get ("PATH", "").split (";") exts = [e.lower () for e in os.environ.get ("PATHEXT", ".exe").split (";")] if __name__ == '__main__': if len (sys.argv) > 1: search_for = sys.argv[1] else: search_for = raw_input ("Search for:") base, ext = os.path.splitext (search_for) if ext: exts = [ext] try: for path in paths: for ext in exts: filepath = os.path.join (path, "%s%s" % (base, ext)) if os.path.isfile (filepath): print filepath raise x_finished except x_finished: pass </code> TJG ________________________________________________________________________ This e-mail has been scanned for all viruses by Star. The service is powered by MessageLabs. For more information on a proactive anti-virus service working around the clock, around the globe, visit: http://www.star.net.uk ________________________________________________________________________ -- http://mail.python.org/mailman/listinfo/python-list