Python邮件中Shell命令显示异常求助:通配符被展开问题
问题排查与解决
问题根源
邮件中*.PDF被展开为具体文件名,是因为**os.system调用shell时,shell自动对通配符*做了扩展解析**,把原命令里的*.PDF替换成了目录下的实际PDF文件列表,而非保留原格式。
解决方案
方案1:改用subprocess模块替代os.system
os.system会通过shell解析所有参数,而subprocess.run可以直接传递参数列表,避免shell对通配符的自动扩展:
import subprocess # 读取邮件模板并替换变量 with open(mail_success_body, 'r') as file: data = file.read().replace('df1_html', df1_html) # 用subprocess执行邮件脚本,参数按列表传递 subprocess.run( ['sh', mail_success_body_txt_file, arg2, data], check=True )
方案2:对通配符进行转义
如果必须保留os.system,需要将命令中的*转义为\*,让shell识别为普通字符而非通配符:
# 转义HTML中的*,避免shell展开 df1_html_escaped = df1_html.replace('*', r'\*') with open(mail_success_body, 'r') as file: data = file.read().replace('df1_html', df1_html_escaped) # 继续使用os.system调用 os.system("""sh '%s' '%s' "%s" """ % (mail_success_body_txt_file, arg2, data))
额外注意
如果你的mail_success_body_txt_file脚本中直接将接收的data参数用于邮件内容输出,确保脚本里对参数的处理不会触发二次通配符扩展——比如避免用echo $3这类方式,改用echo "$3"(用双引号包裹参数)。
内容的提问来源于stack exchange,提问作者Arshiya Fathima
相关产品推荐
相关产品推荐

