You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:32:42