Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

os.path.exists() for files in your Path?

Tags:

python

windows

I commonly use os.path.exists() to check if a file is there before doing anything with it.

I've run across a situation where I'm calling a executable that's in the configured env path, so it can be called without specifying the abspath.

Is there something that can be done to check if the file exists before calling it? (I may fall back on try/except, but first I'm looking for a replacement for os.path.exists())

btw - I'm doing this on windows.

like image 311
monkut Avatar asked Apr 22 '09 01:04

monkut


3 Answers

You could get the PATH environment variable, and try "exists()" for the .exe in each dir in the path. But that could perform horribly.

example for finding notepad.exe:

import os
for p in os.environ["PATH"].split(os.pathsep):
    print os.path.exists(os.path.join(p, 'notepad.exe'))

more clever example:

if not any([os.path.exists(os.path.join(p, executable) for p in os.environ["PATH"].split(os.pathsep)]):
    print "can't find %s" % executable

Is there a specific reason you want to avoid exception? (besides dogma?)

like image 122
Trey Stout Avatar answered Nov 15 '22 20:11

Trey Stout


Extending Trey Stout's search with Carl Meyer's comment on PATHEXT:

import os
def exists_in_path(cmd):
  # can't search the path if a directory is specified
  assert not os.path.dirname(cmd)

  extensions = os.environ.get("PATHEXT", "").split(os.pathsep)
  for directory in os.environ.get("PATH", "").split(os.pathsep):
    base = os.path.join(directory, cmd)
    options = [base] + [(base + ext) for ext in extensions]
    for filename in options:
      if os.path.exists(filename):
        return True
  return False

EDIT: Thanks to Aviv (on my blog) I now know there's a Twisted implementation: twisted.python.procutils.which

EDIT: In Python 3.3 and up there's shutil.which() in the standard library.

like image 5
orip Avatar answered Nov 15 '22 20:11

orip


Please note that checking for existance and then opening is always open to race-conditions. The file can disappear between your program's check and its next access of the file, since other programs continue to run on the machine.

Thus there might still be an exception being thrown, even though your code is "certain" that the file exists. This is, after all, why they're called exceptions.

like image 3
unwind Avatar answered Nov 15 '22 22:11

unwind