【问题标题】:Verifying the existance of a file or folder using subprocess library in python使用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

标签: python subprocess


【解决方案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) 并取出单引号。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-08
    • 2012-10-21
    • 2021-07-02
    • 1970-01-01
    • 2016-03-10
    • 2014-02-09
    • 1970-01-01
    相关资源
    最近更新 更多