我可以非常轻松地使用 OS 库检查文件或文件夹的存在。 以下两个链接描述了这一点 directoryExistance fileExistance
我正在尝试使用 子流程 库来执行相同的操作
并且,我已经尝试了几种方法
1- status = subprocess.call(['test','-e',<path>])
,无论我在路径中传递什么,它总是返回1。
2-使用getstatusoutput,
/ bin / sh:1 ::权限被拒绝
status, result = subprocess.getstatusoutput([<path>]) print(status) print(result)
工作正常,因为如果文件/文件夹存在,状态变量返回126而文件/文件夹不存在时返回127。结果变量也包含消息,但“result”变量包含消息:Permission denied
但是第二个解决方案看起来像是对我的黑客攻击。这样做是更好的方式吗?
答案 0 :(得分:1)
test
命令是内置的shell,并且在许多平台上不作为可以运行的独立命令存在。
如果使用shell=True
使用shell运行此命令,则应传入单个字符串,而不是令牌列表。
status = subprocess.call("test -e '{}'".format(path), shell=True)
如果path
包含任何单引号,则会生成格式错误的命令;如果您想要完全正确和健壮,请尝试path.replace("'", r"\'")
,或者使用现有的引用函数之一来正确地转义您传入的命令中的任何shell元字符。
subprocess
库现在提供了一个函数run()
,它比旧的call()
函数略显笨拙;如果向后兼容性不重要,你应该切换到那个......或者,正如几个评论者已经恳求过你的那样,当可移植的轻量级本机Python解决方案可用时,不要使用subprocess
来完成这项任务。
答案 1 :(得分:0)
如评论部分所述
status = subprocess.call(['test','-e',<path>])
如果我们使用 &#34; shell = True&#34; ,可以使用shell扩展
尽管使用os.path可能会更有效率。