使用python中的子进程库验证文件或文件夹的存在性
我可以使用OS库非常轻松地检查文件或文件夹的存在。 以下两个链接描述了这一点 我正在尝试使用子流程库执行相同的操作 而且,我已经尝试了几种方法 1-使用python中的子进程库验证文件或文件夹的存在性,python,subprocess,Python,Subprocess,我可以使用OS库非常轻松地检查文件或文件夹的存在。 以下两个链接描述了这一点 我正在尝试使用子流程库执行相同的操作 而且,我已经尝试了几种方法 1-status=subprocess.call(['test','-e',]),无论我在路径中传递什么,它总是返回1 2-使用getstatusoutput /bin/sh:1::权限被拒绝 status, result = subprocess.getstatusoutput([<path>]) print(status) print(
status=subprocess.call(['test','-e',])
,无论我在路径中传递什么,它总是返回1
2-使用getstatusoutput
/bin/sh:1::权限被拒绝
status, result = subprocess.getstatusoutput([<path>])
print(status)
print(result)
status,result=subprocess.getstatusoutput([])
打印(状态)
打印(结果)
这很正常,因为如果文件/文件夹存在,状态变量返回126,如果文件/文件夹不存在,状态变量返回127。结果变量也包含消息,但“result”变量包含消息:Permission denied
status, result = subprocess.getstatusoutput([<path>])
print(status)
print(result)
但第二个解决方案在我看来像是一个黑客。这是一种更好的方法吗?如评论部分所述
status = subprocess.call(['test','-e',<path>])
status=subprocess.call(['test','-e',]))
如果我们使用“shell=True”
尽管使用os.path可能更有效。test命令是一个shell内置命令,在许多平台上,它并不是一个可以运行的独立命令 如果使用
shell=True
来使用shell运行此命令,则应传入单个字符串,而不是令牌列表
status = subprocess.call("test -e '{}'".format(path), shell=True)
如果path
包含任何单引号,则会生成格式错误的命令;如果您希望完全正确和可靠,请尝试path.replace(“”,r“\”)
,或者使用现有的引用函数之一正确转义传入的命令中的任何shell元字符
子流程
库现在提供了一个函数run()
,它比旧的传统call()
函数稍微简单一些;如果向后兼容性不重要,您可能应该切换到。。。或者,正如一些评论员已经恳求您的那样,当可移植的、轻量级的本机Python解决方案可用时,不要使用子流程来执行此任务。“/bin/sh:1::Permission denied”错误地写在第二点中。现代的方法是使用。不要使用“~”。在我的ubuntu平台中,我需要我的路径类似于“~/workspace/datasets”。@glibdud。使用shell=True
仅在命令是字符串而不是列表且需要考虑的情况下才有效。值得一提的是,test-e
仅检查文件系统中是否存在具有给定名称的条目。也许您实际上正在寻找test-f
和test-d
,它们分别附加检查它是否引用常规文件或目录。实际上replace
提示是错误的,但太懒了,无法返回并修复它。可能只需要使用shlex.quote(path)
并去掉单引号。