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
相关产品推荐
相关产品推荐

