使用python中的子进程库验证文件或文件夹的存在
Posted
技术标签:
【中文标题】使用python中的子进程库验证文件或文件夹的存在【英文标题】:Verifying the existance of a file or folder using subprocess library in python 【发布时间】:2018-05-05 08:14:41 【问题描述】:我可以使用 OS 库非常轻松地检查文件或文件夹是否存在。 以下两个链接描述了 directoryExistance fileExistance
我正在尝试使用 subprocess 库来做同样的事情
而且,我已经尝试了几种方法
1-status = subprocess.call(['test','-e',<path>])
,无论我在路径中传递什么,它总是返回 1。
2- 使用 getstatusoutput,
/bin/sh: 1: : 权限被拒绝
status, result = subprocess.getstatusoutput([<path>]) print(status) print(result)
这工作正常,因为如果文件/文件夹存在,状态变量返回 126,而当文件/文件夹不存在时,状态变量返回 127。结果变量也包含消息,但“结果”变量包含消息:权限被拒绝
但第二个解决方案对我来说似乎是一个 hack。他们这样做是更好的方法吗?
【问题讨论】:
"/bin/sh: 1: : Permission denied",第二点写错了。 现代方式是使用pathlib
。
不适用于“~”。在我的 ubuntu 平台上
我需要我的路径类似于“~/workspace/datasets”。
@glibdud。使用shell=True
仅在命令是字符串而不是列表时才有效,并且需要考虑security considerations。
【参考方案1】:
如 cmets 部分所述
status = subprocess.call(['test','-e',<path>])
如果我们使用 "shell=True"
,则可以使用 shell 扩展虽然使用 os.path 可能更有效。
【讨论】:
【参考方案2】:test
命令是一个内置的 shell,在许多平台上并不作为可以运行的独立命令存在。
如果你使用shell=True
来使用shell 运行这个命令,你应该传入一个字符串,而不是一个令牌列表。
status = subprocess.call("test -e ''".format(path), shell=True)
如果path
包含任何单引号,这将产生一个格式错误的命令;如果您想完全正确和健壮,请尝试 path.replace("'", r"\'")
,或者使用现有的引用函数之一正确转义您传入的命令中的任何 shell 元字符。
subprocess
库现在提供了一个函数 run()
,它比旧的旧的 call()
函数稍微不那么笨拙;如果向后兼容性不重要,您可能应该切换到那个...
【讨论】:
不管怎样,test -e
只是检查文件系统中是否存在具有给定名称的条目。也许您实际上正在寻找test -f
和test -d
,它们还分别检查它是指常规文件还是目录。
其实replace
的提示是错误的,只是懒得回去修了。可能只是使用shlex.quote(path)
并取出单引号。以上是关于使用python中的子进程库验证文件或文件夹的存在的主要内容,如果未能解决你的问题,请参考以下文章
如何从 CLI 下载 GitHub 存储库中的子文件夹/文件
如何在 Python 中运行 Google Cloud Function 中的子进程
Android 逆向Android 进程注入工具开发 ( 远程进程 注入动态库 文件操作 | Android 进程读取文件所需的权限 | fopen 打开文件标志位 | 验证文件权限 )
Android 逆向Android 进程注入工具开发 ( 远程进程 注入动态库 文件操作 | Android 进程读取文件所需的权限 | fopen 打开文件标志位 | 验证文件权限 )