python子进程检查输出:如何获得整个消息?

问题描述 投票:0回答:1

我在hadoop中使用subprocess.check_output来删除文件夹,希望能够得到和从控制台执行hadoop命令一样的结果。

所以,可能会出现这样的情况:我试图删除多个目录,但其中一些目录并不存在。

这个命令完全失败了(因为我的 "不存在 "的目录找不到)。

subprocess.check_output('hadoop fs -rm -r -skipTrash my_host/path_to_existing_directory my_host/path_to_nonexisting_directory', shell = True)

为了防止失败,我可以这样做。

try:
    subprocess.check_output('hadoop fs -rm -r -skipTrash  my_host/path_to_existing_directory/ my_host/path_to_nonexisting_directory', shell = True)
except subprocess.CalledProcessError as e:
    print(e.output, 'some of the folders were not found')

第二种方法更好,因为它能告诉我哪些目录被删除了,如果有的话 为了区分有些目录没有被删除,我可以在打印输出中加上 "有些文件夹没有被找到"。

然而,当我在命令行执行同样的命令时,我得到了更好的信息,我希望能复制。

hadoop fs -rm -r -skipTrash  my_host/path_to_existing_directory/ my_host/path_to_nonexisting_directory

返回:

Deleted my_host/path_to_existing_directory
rm: `my_host/path_to_nonexisting_directory': no such file or directory
python hadoop subprocess
1个回答
3
投票

进程可能会将错误信息写到 标准 错误 溪流 stderr,你也可以通过将它重定向到标准输出来捕获它。stdout 使用参数 stderr=subprocess.STDOUT

所以,你的代码会像这样。

try:
    output = subprocess.check_output('...', shell = True, stderr=subprocess.STDOUT)
except subprocess.CalledProcessError as e:
    print(e.output, 'some of the folders were not found')
© www.soinside.com 2019 - 2024. All rights reserved.