使用python中的子进程库验证文件或文件夹的存在

时间:2017-11-21 18:36:59

标签: python subprocess

我可以非常轻松地使用 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

但是第二个解决方案看起来像是对我的黑客攻击。这样做是更好的方式吗?

2 个答案:

答案 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可能会更有效率。