一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

如何利用Python获取当前运行脚本的绝对路径?

时间:2026-06-23 08:36:52 编辑:袖梨 来源:一聚教程网

最可靠方式是用 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 到别处再运行,结果也不变
  • 注意:如果脚本被 pyinstaller 打包成单文件 exe,__file__ 会指向临时解压路径,不是原始源码位置

pathlib.Path(__file__).resolve() 更现代、更安全

Python 3.4+ 推荐用 pathlibPath(__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()),后续再拼就彻底不可靠。

  • 哪怕你确认当前没改工作目录,也不能保证未来调用方不会这么用
  • Windows 下还容易因大小写、盘符格式(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",别手写斜杠。

热门栏目