【问题标题】:How to prevent subprocess.run() output? [duplicate]如何防止 subprocess.run() 输出? [复制]
【发布时间】:2023-01-08 23:21:28
【问题描述】:

我正在使用 subprocess 模块来创建一些目录。但是在某些情况下,同一命令可能会在受限目录中创建目录。在这种情况下,我会向控制台输出:mkdir: cannot create directory 'location/to/directory': Permission denied

如何避免此输出到控制台?

我尝试了以下命令:

subprocess.run(["mkdir", "-p", f"{outdir}/archive/backup_{curr_date}/"],check=True,stdout=subprocess.DEVNULL)
subprocess.run(["mkdir", "-p", f"{outdir}/archive/backup_{curr_date}/"],check=True,stdout=subprocess.PIPE)
subprocess.run(["mkdir", "-p", f"{outdir}/archive/backup_{curr_date}/"],check=True,capture_output=True)

【问题讨论】:

  • 为什么要运行子进程来创建目录?为此使用os.mkdir
  • 由于输出是一个错误,它可能通过 stderr 而不是 stdout。
  • 标准错误是无。由于某种原因,这不会引发异常。
  • @zvone 不使用os.mkdir() 因为我想创建中间目录。因此,另一种选择是使用makedirs(),但随后它会引发FileExistsError,但我想捕获权限被拒绝的实际原因。

标签: python python-3.x subprocess stdout


【解决方案1】:

更好的方法

os.mkdirs 是创建新目录的更好方法。

可以这样使用:

try:
    os.makedirs(f"{outdir}/archive/backup_{curr_date}/", exist_ok=True)
except PermissionError as e:
    print(e)

如果它不存在,它也会创建一个 outdir


使固定

mkdir: 无法创建目录“location/to/directory”

这不是标准输出,而是打印在控制台上的错误。首先,不应抑制和正确处理此错误。但在极端情况下,如果这是所需的结果,那么你应该像这样 DEVNULL stderr stderr=subprocess.DEVNULL

subprocess.run(["mkdir", "-p", f"{outdir}/archive/backup_{curr_date}/"], check=True, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)

【讨论】:

  • 我实际上正在使用 click 开发命令行应用程序。因此,如果我在受限位置创建目录,我想记录 mkdir: cannot create directory 'location/to/directory': Permission denied 错误。即使我对 stderr 和 stdout 执行 subprocess.DEVNULL,它仍然会打印到终端。我不明白为什么。
  • 我对 makedirs() 的唯一问题是,如果在受限位置创建目录,它不会引发正确的错误。
  • 如果 os.makedirs 试图创建进程用户没有写入权限的目录,它也会抛出 PermissionError。 [Errno 1] 不允许操作:{dir_name_here}
猜你喜欢
  • 2017-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-16
  • 2021-12-17
相关资源
最近更新 更多