Python邮件附件转热敏打印头文件Crontab运行失败排查
问题解决:Crontab启动Python脚本时importlib找不到生成的模块
问题核心
IDE中运行正常,但Crontab开机启动时,生成的.py模块无法被importlib.import_module()找到,触发ModuleNotFoundError。这是因为Crontab执行环境的Python模块搜索路径(sys.path)与IDE环境不一致:默认情况下Crontab的工作目录是用户主目录,而生成的模块文件在脚本所在的/home/badz/Desktop/Codes/目录,不在Python的搜索路径内。
解决方案
方案1:将脚本所在目录添加到Python搜索路径
在qrPrint.py的开头部分添加以下代码,确保生成模块的目录被加入sys.path:
import sys import os # 获取当前脚本的绝对路径所在目录 script_dir = os.path.dirname(os.path.abspath(__file__)) # 如果该目录不在sys.path中,添加进去 if script_dir not in sys.path: sys.path.append(script_dir)
这样无论脚本从哪个目录启动,Python都会搜索当前脚本所在的目录,能找到生成的QR-Code-#45-Vuvu_bytes.py文件。
方案2:修改Crontab执行时的工作目录
修改runCodes.py,先切换到脚本所在目录再执行命令:
import os # 切换到代码所在目录 os.chdir("/home/badz/Desktop/Codes/") os.system("python3 FOR-IN-NEW.py &") os.system("python3 qrPrint.py &")
这样脚本执行时的当前工作目录就是模块生成的目录,Python会默认搜索当前工作目录,自然能找到生成的模块。
额外提示:处理开机网络延迟
错误日志中出现ping: connect: Network is unreachable,说明开机时网络尚未就绪。可以在qrPrint.py中添加网络等待逻辑,避免过早尝试连接邮件服务器:
import time import socket def wait_for_network(): while True: try: # 尝试连接公共DNS服务器判断网络状态 socket.create_connection(("8.8.8.8", 53), timeout=5) break except OSError: time.sleep(2) # 在邮件操作前调用 wait_for_network()
内容的提问来源于stack exchange,提问作者badzzzz
相关产品推荐
相关产品推荐

