最可靠方式是用 os.path.abspath(__file__) 或 pathlib.Path(__file__).resolve() 获取脚本绝对路径,二者均能解析符号链接并补全为完整路径,且不依赖工作目录;需注意打包后 file 指向临时路径。
os.path.abspath(__file__) 获取脚本绝对路径最可靠这是最常用也最稳妥的方式,__file__ 是 Python 解释器自动注入的变量,指向当前模块(.py 文件)的路径,无论脚本是直接运行还是被导入,os.path.abspath() 都能将其转为绝对路径。
常见错误是只用 __file__ 本身——它可能是相对路径(比如执行时在上层目录下运行 python sub/main.py),也可能带符号链接;而 os.path.abspath() 会自动解析符号链接并补全为完整路径。
__file__ 指向的仍是该脚本文件)os.getcwd()),所以即使用户 cd 到别处再运行,结果也不变__file__ 会指向临时解压路径,不是原始源码位置pathlib.Path(__file__).resolve() 更现代、更安全Python 3.4+ 推荐用 pathlib,Path(__file__).resolve() 效果等价于 os.path.abspath(),但语义更清晰,且自动处理跨平台路径分隔符和符号链接。
相比 os.path,它不会因为路径字符串拼接出错(比如误加双反斜杠或漏掉 /),也更容易链式操作——比如取父目录:Path(__file__).resolve().parent。
立即学习“Python免费学习笔记(深入)”;
.resolve() 默认会检查路径是否存在,若不存在会抛 FileNotFoundError;如需跳过检查,加参数 strict=False
.resolve() 可能失败,而 os.path.abspath() 不会.resolve() 返回的是真实文件路径,不是链接路径os.getcwd() + __file__ 拼接这种写法看似直观,但极其危险:一旦工作目录和脚本所在目录不同(比如从项目根目录运行 python src/app.py),拼出来的就是错路径。
更糟的是,os.getcwd() 可能在运行中被代码修改(比如调用了 os.chdir()),后续再拼就彻底不可靠。
C: vs c:)导致路径比较失败os.getcwd() 的路径构造,都应视为临时方案,仅用于生成日志文件名等非关键路径多数时候你要的是“脚本在哪个文件夹”,而非“脚本文件全名”。这时候别忘了去掉文件名:
import osscript_dir = os.path.dirname(os.path.abspath(__file__))<h1>或 pathlib 版</h1><p>from pathlib import Pathscript_dir = Path(<strong>file</strong>).resolve().parent
注意 os.path.dirname() 对纯文件名(不含 /)返回空字符串,所以必须先用 abspath() 或 resolve() 确保路径含目录结构;直接对 __file__ 调用 dirname 在相对路径场景下会失效。
如果你要加载同目录下的配置文件或资源,用这个 script_dir 拼接最稳——但记得用 os.path.join(script_dir, "config.json") 或 script_dir / "config.json",别手写斜杠。