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

前端 未结 5 2045

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

相关标签:
5条回答
  • 2021-02-04 07:35

    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.

    0 讨论(0)
  • 2021-02-04 07:46

    You generally shouldn't should os.path.exists to try to figure out if something is going to succeed. You should just try it and if you want you can handle the exception if it fails.

    0 讨论(0)
  • 2021-02-04 07:55

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

    0 讨论(0)
  • 2021-02-04 07:56

    On Unix you have to split the PATH var.

    if any([os.path.exists(os.path.join(p,progname)) for p in os.environ["PATH"].split(":")]):
        do_something()
    
    0 讨论(0)
  • 2021-02-04 07:57

    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.

    0 讨论(0)
提交回复
热议问题