os.path.exists()为您的path中的文件?

我通常使用os.path.exists()来检查文件是否在做任何事之前。

我遇到了一种情况,我调用了configuration的envpath中的可执行文件,因此可以在不指定abspath情况下调用abspath

有没有办法可以在调用之前检查文件是否存在? (我可能会回来try/except ,但首先我正在寻找替代os.path.exists()

顺便说一句 – 我在Windows上这样做。

您可以获取PATH环境变量,并在路径中的每个目录中为.exe尝试“exists()”。 但是这可能会造成可怕的结果。

找到notepad.exe的例子:

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

更聪明的例子:

 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 

是否有一个特定的原因,你想避免异常? (除了教条?)

用Carl Meyer对PATHEXT的评论扩展Trey Stout的搜索范围:

 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 

编辑:感谢Aviv(在我的博客)我现在知道有一个扭曲的实现: twisted.python.procutils.which

请注意,检查存在然后打开总是开放的比赛条件。 该文件可以在程序的检查和下次访问文件之间消失,因为其他程序会继续在机器上运行。

因此,即使您的代码“确定”该文件存在,仍然可能会抛出异常。 毕竟,这就是为什么他们被称为例外。

你通常不应该os.path.exists试图找出是否会成功。 你应该尝试一下,如果你想要的话,如果失败,你可以处理异常。

在Unix上,你必须分割PATH变种。

 if any([os.path.exists(os.path.join(p,progname)) for p in os.environ["PATH"].split(":")]): do_something()