Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用python中的子进程库验证文件或文件夹的存在性_Python_Subprocess - Fatal编程技术网

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

使用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(

我可以使用OS库非常轻松地检查文件或文件夹的存在。 以下两个链接描述了这一点

我正在尝试使用子流程库执行相同的操作

而且,我已经尝试了几种方法

1-
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)
并去掉单引号。