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

Python Shell脚本无参数时避免报错并设置默认值的方法

解决Python磁盘监控脚本无参数时的默认值问题

你的问题根源在于:原脚本中argparse将user和alert定义为必填位置参数,当没有传入参数时,parser.parse_args()会直接触发错误并终止脚本,根本执行不到后面的sys.argv判断逻辑。

修复方案(两种可选)

方案1:改用可选参数(推荐,符合命令行规范)

将参数改为带--前缀的可选参数,并直接设置默认值,同时给alert指定type=int,避免后续手动转换:

#!/usr/bin/env python3

import argparse
import subprocess

parser = argparse.ArgumentParser(description="Disk usage monitoring script with email alerts")
parser.add_argument("--user", help="Local email account to send notifications to", default="kkelly")
parser.add_argument("--alert", help="Disk usage percentage threshold for alerts", type=int, default=90)
args = parser.parse_args()

admin = args.user
alert = args.alert

# Capture hostname
hostname = subprocess.check_output(["hostname"], text=True).strip()
# Capture current timestamp
date = subprocess.check_output(["date"], text=True).strip()

# Gather and process disk usage data
df_output = subprocess.check_output(["df", "-H"], text=True)
for line in df_output.splitlines():
    # Skip irrelevant lines
    if line.startswith("Filesystem") or "tmpfs" in line or "cdrom" in line:
        continue
    parts = line.split()
    usage_str = parts[4]
    partition = parts[0]
    usage = int(usage_str.rstrip('%'))
    
    if usage > alert:
        subject = f"Alert: {hostname} is almost out of disk space"
        body = f"{hostname} is running out of space on {partition} partition. As of {date} it is at {usage_str}."
        # Send alert email
        subprocess.run(
            ["mail", "-s", subject, admin],
            input=body,
            text=True
        )

方案2:保留位置参数但设为可选

如果希望继续使用位置参数格式,可通过nargs='?'标记参数为可选,并设置默认值:

parser = argparse.ArgumentParser()
parser.add_argument("user", help="Which user would you like to send the alert to", nargs='?', default="kkelly")
parser.add_argument("alert", help="What would you like to alert set to?", nargs='?', type=int, default=90)
args = parser.parse_args()

admin = args.user
alert = args.alert

额外优化说明

  • 用subprocess模块替代os.popen/os.system:更安全,避免命令注入风险,且符合Python官方推荐的用法
  • 直接解析df输出:无需调用额外的awk/cut命令,减少系统开销
  • 使用f-string拼接字符串:比传统字符串拼接更简洁、易读

内容的提问来源于stack exchange,提问作者mrolive

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 01:35:23