最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
如何利用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+ 推荐用 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()),后续再拼就彻底不可靠。
- 哪怕你确认当前没改工作目录,也不能保证未来调用方不会这么用
- Windows 下还容易因大小写、盘符格式(
C:vsc:)导致路径比较失败 - 所有基于
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",别手写斜杠。
相关文章
- steam上传视频教程 06-23
- 布袋鼠小说app如何进行阅读 06-23
- 快手极速版官方App网页版在哪下载 06-23
- 我的世界2026秒玩入口网址是什么 06-23
- 空洞骑士丝之歌全部五个结局攻略 丝之歌结局达成条件 06-23
- 崩坏3 8.7新春版本福利一览 06-23