我通常使用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()