使用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 -ftest -d,它们还分别检查它是指常规文件还是目录。 其实replace的提示是错误的,只是懒得回去修了。可能只是使用shlex.quote(path) 并取出单引号。

以上是关于使用python中的子进程库验证文件或文件夹的存在的主要内容,如果未能解决你的问题,请参考以下文章

如何从 CLI 下载 GitHub 存储库中的子文件夹/文件

如何从 Python 中的子文件夹导入模块或文件?

Python:产生具有几个要求的子进程

如何在 Python 中运行 Google Cloud Function 中的子进程

Android 逆向Android 进程注入工具开发 ( 远程进程 注入动态库 文件操作 | Android 进程读取文件所需的权限 | fopen 打开文件标志位 | 验证文件权限 )

Android 逆向Android 进程注入工具开发 ( 远程进程 注入动态库 文件操作 | Android 进程读取文件所需的权限 | fopen 打开文件标志位 | 验证文件权限 )