Python中try-except处理mount命令异常的技术求助
解决Python挂载脚本的异常处理问题
你的问题核心在于check_output命令在mount执行失败(非0退出码)时会直接抛出subprocess.CalledProcessError,导致后续的判断逻辑根本无法运行。我们需要通过try-except捕获这个异常,并根据不同的错误信息分支处理,同时还要正确获取mount命令的错误输出。
下面是修正后的完整脚本:
from subprocess import check_output, CalledProcessError import sys def Mounting(): print "Mounting" print "Mount CD and Press Enter" raw_input("Press Enter to continue...") for x in range(0,5): device = "/dev/sr{}".format(x) try: # 捕获stdout和stderr,因为mount的错误信息会输出到stderr mount_output = check_output( ["mount", device, "/mnt"], stderr=subprocess.STDOUT, universal_newlines=True # 让输出变成字符串而非字节流 ) # 如果执行到这里,说明mount成功了 # 检查是否是只读挂载的提示(这是正常成功的情况) if "write-protected, mounting read-only" in mount_output: print "Successfully mounted {} to /mnt".format(device) break except CalledProcessError as e: # 获取命令的输出(包含错误信息) error_output = e.output # 情况1:无介质,继续下一个设备 if "no medium found on {}".format(device) in error_output: print "No medium found on {}, trying next device...".format(device) continue # 情况2:设备已挂载,终止程序 elif "already mounted on /mnt" in error_output: print "/mnt has already been mounted. Unmount /mnt and rerun the script." sys.exit(1) # 其他未知错误,打印信息并退出 else: print "Unexpected error when mounting {}: {}".format(device, error_output.strip()) sys.exit(1) else: # 循环所有设备都没成功挂载的情况 print "Could not find any valid CD-ROM device to mount." sys.exit(1) if __name__ == "__main__": Mounting()
关键说明:
- 捕获异常并获取错误输出:通过
stderr=subprocess.STDOUT把错误信息合并到stdout中,这样可以从CalledProcessError的output属性拿到完整的命令输出。 - 分支处理两种异常场景:
- 当错误信息包含
no medium found时,跳过当前设备,继续循环下一个。 - 当错误信息包含
already mounted时,打印提示并终止程序。
- 当错误信息包含
- 处理正常成功的情况:mount成功时(即使提示只读挂载),打印成功信息并跳出循环。
- 循环结束后的兜底处理:如果遍历完0-4所有sr设备都没成功,给出提示并退出。
内容的提问来源于stack exchange,提问作者preethy tulpi
相关产品推荐
相关产品推荐

