Python:手动运行正常但crontab执行邮件附件失效问题排查
嘿,这个问题我太熟了!crontab跑脚本和手动执行的核心差异就是工作目录和环境变量,你的附件加不上大概率是路径搞的鬼,咱们一步步来搞定它:
问题根源
crontab默认的工作目录是你的用户主目录(比如/home/your_username/),但你手动跑脚本时是在脚本所在的文件夹里执行的,所以代码里glob.glob('*%s'%fi)这种相对路径,在crontab环境下根本找不到目标文件,自然没法添加附件。
具体解决方法
方法一:给所有文件路径加上绝对路径(最稳妥)
修改你的Python代码,先获取脚本本身的绝对目录,再基于这个目录去找目标文件,这样不管在哪里执行脚本都能准确定位文件:
#!/usr/bin/python import smtplib import os import datetime import glob import time from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from email.mime.application import MIMEApplication # 获取脚本所在的绝对目录(关键修改) script_dir = os.path.dirname(os.path.abspath(__file__)) now = datetime.datetime.now() fi = now.strftime("%d%m%Y" '_0600_final.txt') # 用绝对路径拼接后查找文件(关键修改) files1 = glob.glob(os.path.join(script_dir, '*%s' % fi)) time.sleep(20) # 后面的代码保持不变...
方法二:在crontab里指定工作目录
编辑crontab任务时,先切换到脚本所在的目录再执行脚本,这样相对路径就和手动执行时一致了:
# 举个例子,假设你的脚本在/home/you/scripts/目录下 0 7 * * * cd /home/you/scripts/ && python your_script.py
方法三:加日志调试(排查问题用)
如果还是有问题,可以在脚本里加些日志输出,看看crontab执行时的状态:
# 在脚本开头附近加这些打印 print("当前工作目录:", os.getcwd()) print("找到的文件列表:", files1)
然后把crontab的输出重定向到日志文件,方便查看:
0 7 * * * python /home/you/scripts/your_script.py >> /var/log/email_script.log 2>&1
打开日志文件就能知道是没找到文件,还是有其他权限、环境问题。
额外注意事项
- 确保crontab执行的用户和你手动跑脚本的用户是同一个,不然可能出现文件权限问题,读不到附件。
- 如果用了Python虚拟环境,crontab里要写虚拟环境的Python绝对路径,比如
/home/you/venv/bin/python,而不是直接写python。
内容的提问来源于stack exchange,提问作者SAEED MAHMOOD ASLAM
相关产品推荐
相关产品推荐

