从其他目录运行Python文件提示找不到'__main__'模块如何解决?
问题解决办法
错误根源
你遇到的报错是路径依赖工作目录导致的,代码里所有相对路径、os.getcwd()的逻辑,都会跟随你执行命令的目录变化,从父目录运行、crontab运行时,工作目录和脚本所在目录不一致,就会找不到依赖模块、模型文件,进而触发can't find '__main__' module等报错。
修复步骤
1. 修改代码内路径逻辑,替换相对路径为基于脚本位置的绝对路径
在代码开头导入os后,先获取当前脚本的绝对目录:
# 获取当前脚本所在的绝对目录,不会跟随执行目录变化 SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
替换原有路径相关代码:
- 原来的
sys.path.append('..')替换为:
# 添加上级目录到导入路径,固定指向脚本所在目录的上级 sys.path.append(os.path.join(SCRIPT_DIR, '..'))
- 原来的
CWD_PATH = os.getcwd()替换为:
CWD_PATH = SCRIPT_DIR
- 如果需要将生成的
encoded_string.txt、opencv.png保存在脚本所在目录,修改对应文件路径:
# 写encoded_string.txt的部分 with open(os.path.join(SCRIPT_DIR, 'encoded_string.txt') ,'wb') as f: # 写opencv.png的部分 cv2.imwrite(os.path.join(SCRIPT_DIR, 'opencv.png'),image)
2. 手动运行命令调整
如果要从父目录启动脚本,不要直接传相对路径,先切换到脚本所在目录再执行:
cd /完整路径到/subfile && python3 example.py
3. crontab开机自启配置调整
crontab的默认工作目录是用户家目录,且默认没有图形环境权限,修改@reboot规则如下:
@reboot export DISPLAY=:0 && cd /完整路径到/subfile && /usr/bin/python3 example.py >> /var/log/obj_detect.log 2>&1
说明:
- 先执行
cd切换到脚本所在目录,保证路径正确 - 执行
which python3可以查询你环境中python3的绝对路径,替换上面的/usr/bin/python3 - 末尾加日志输出,后续报错可以查看
/var/log/obj_detect.log排查 export DISPLAY=:0是给cv2的图形窗口授权,如果你不需要显示检测窗口,可以注释掉代码里的cv2.imshow相关逻辑,同时去掉这部分配置
内容的提问来源于stack exchange,提问作者Seungmin Lee
相关产品推荐
相关产品推荐

