我通常使用os.path.exists()
来检查文件是否存在,然后再对其进行操作。
我遇到过一种情况,我正在调用已配置的env路径中的可执行文件,因此可以在不指定abspath
的情况下调用它。
在调用之前是否可以执行某些操作来检查文件是否存在?
(我可能会回到try/except
,但首先我正在寻找替代os.path.exists()
)
答案 0 :(得分:13)
您可以获取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
您是否有特殊原因要避免异常? (除了教条?)
答案 1 :(得分:3)
通过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实现:twisted.python.procutils.which
答案 2 :(得分:2)
请注意,检查是否存在然后打开对比赛条件始终开放。由于其他程序继续在机器上运行,文件可能会在程序检查和下次访问文件之间消失。
因此,即使您的代码“确定”该文件存在,仍可能会抛出异常。毕竟,这就是他们被称为例外的原因。
答案 3 :(得分:2)
你通常不应该os.path.exists试图弄清楚某些事情是否会成功。您应该尝试一下,如果您愿意,可以在失败时处理异常。
答案 4 :(得分:0)
在Unix上,您必须拆分PATH var。
if any([os.path.exists(os.path.join(p,progname)) for p in os.environ["PATH"].split(":")]):
do_something()