我通常使用os.path.exists()
来检查一个文件是否存在,然后再做任何事情。os.path.exists()为您的路径中的文件?
我已经运行了一个情况,我调用了配置的env路径中的可执行文件,因此可以在不指定abspath
的情况下调用它。
有没有什么办法可以在调用之前检查文件是否存在? (我可能会回落try/except
,但首先我要找的替代品os.path.exists()
)
btw - 我在Windows上这样做。
我通常使用os.path.exists()
来检查一个文件是否存在,然后再做任何事情。os.path.exists()为您的路径中的文件?
我已经运行了一个情况,我调用了配置的env路径中的可执行文件,因此可以在不指定abspath
的情况下调用它。
有没有什么办法可以在调用之前检查文件是否存在? (我可能会回落try/except
,但首先我要找的替代品os.path.exists()
)
btw - 我在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
有你想要避免异常的具体原因是什么? (除了教条?)
在Unix上,你必须拆分PATH变种。
if any([os.path.exists(os.path.join(p,progname)) for p in os.environ["PATH"].split(":")]):
do_something()
请注意,检查存在然后打开总是对比赛条件开放。该文件可以在程序的检查和下一次访问文件之间消失,因为其他程序会继续在机器上运行。
因此,即使您的代码“确定”该文件存在,仍可能会抛出异常。毕竟,这就是为什么他们被称为例外。
你通常不应该os.path.exists试图找出是否会成功。你应该尝试一下,如果你想要,你可以处理异常,如果它失败。
扩展特雷粗壮的与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
编辑:感谢特拉维夫(在我的博客),我现在知道有一个扭曲的实现:twisted.python.procutils.which
这是不够的检查它存在;您至少需要检查它是否可执行。 – 2013-01-13 21:36:35