You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

os.path.realpath(__file__)返回异常路径及文件存储位置异常咨询

问题原因与解决方案

这种情况我之前在macOS上也碰到过,核心原因是你使用的Python解释器属于Python.app这个GUI应用包,而不是终端原生的命令行版本。

为什么会出现这个问题?

  • 当Python.app启动时,它的默认工作目录(也就是os.getcwd()返回的路径)会被固定为它自身的Resources目录,也就是你看到的/usr/local/Cellar/python/3.7.6_1/Frameworks/Python.framework/Versions/3.7/Resources/Python.app/Contents/Resources/,而不是你脚本所在的项目目录。
  • __file__本身是正确的相对路径tools/debug_tool.py,但os.path.realpath()和os.path.abspath()是基于当前工作目录来解析相对路径的,所以自然会把相对路径拼到Python.app的目录后面,得到错误的绝对路径。
  • 至于cv2.imwrite保存文件到那个目录,也是因为它默认使用当前工作目录作为保存路径。

解决方法

1. 改用终端原生的命令行Python解释器

先检查你当前用的python3指向哪里:

which python3

如果输出是类似/usr/local/Cellar/python/3.7.6_1/Frameworks/Python.framework/Versions/3.7/Resources/Python.app/Contents/MacOS/Python,说明你用的是Python.app里的GUI版本。

解决办法:

  • 直接使用命令行版本的Python路径运行脚本,比如如果你的命令行Python在/usr/local/bin/python3,就运行:
    /usr/local/bin/python3 tools/debug_tool.py
    
  • 或者调整你的PATH环境变量,把命令行Python的目录(比如/usr/local/bin)放到Python.app目录前面,这样python3就会优先调用命令行版本。

2. 在脚本内手动切换工作目录

如果不想改环境变量,就在脚本最开头加上这段代码,强制把工作目录切换到脚本所在的目录:

import os

# 获取脚本所在的绝对目录
script_dir = os.path.dirname(os.path.abspath(__file__))
# 切换到该目录
os.chdir(script_dir)

这样之后:

  • os.getcwd()会返回你的项目工具目录(/Users/my_user/my_project/tools/),如果需要项目根目录,可以再往上跳一级:os.chdir(os.path.dirname(script_dir))
  • os.path.realpath(__file__)会正确返回/Users/my_user/my_project/tools/debug_tool.py
  • cv2.imwrite保存的文件也会出现在脚本所在目录(或你指定的项目目录)里

3. 运行脚本前先切换到项目根目录

最简单的方式:先cd到你的项目根目录再运行脚本:

cd /Users/my_user/my_project
python3 tools/debug_tool.py

这样当前工作目录就是项目根目录,所有路径解析都会正常工作。

内容的提问来源于stack exchange,提问作者mrgloom

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 07:47:41