我在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
进程可能会将错误信息写到 标准 错误 溪流 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')