最可靠方式是用__file__,它是Python解释器自动注入的内置变量,值为当前脚本路径;配合os.path.abspath(__file__)或pathlib.Path(__file__).resolve()可得绝对路径,不受Sublime Build System影响。

Python里用__file__获取当前脚本路径最可靠
Sublime Text 本身不提供“当前脚本路径”的 API,它只是把你的 Python 文件交给解释器执行。真正决定路径的是 Python 运行时环境,所以得靠 Python 自己的方法。最直接、兼容性最好的方式就是用 __file__ —— 它是 Python 解释器自动注入的内置变量,值为当前模块(即你运行的 .py 文件)的绝对路径(或相对路径,取决于你怎么启动的)。
常见错误是直接写 os.getcwd(),这返回的是 Sublime Text 启动时的工作目录(通常是安装目录或用户配置目录),不是你的脚本所在位置,尤其在用 Build System 运行时几乎总是错的。
- 如果脚本是直接运行(比如按
Ctrl+B),__file__通常是绝对路径,如/home/user/project/main.py - 如果脚本被 import 进来,
__file__仍指向该模块文件路径,不会变 - 想转成绝对路径保险起见,统一用
os.path.abspath(__file__)或pathlib.Path(__file__).resolve()
Sublime Text 的 Build System 会影响 __file__ 的表现吗?
不影响。Build System 只控制怎么调用 Python 解释器(比如加参数、换解释器路径),不干预 Python 内部变量。但要注意:如果你在 Build System 中用了 "working_dir": "${file_path}",这只是改变了 os.getcwd(),对 __file__ 没任何影响。
典型错误配置是没设 working_dir,导致脚本里读取同目录下的 config.json 失败 —— 这时候问题不在 __file__,而在你用 open("config.json") 时依赖了当前工作目录。正确做法是基于 __file__ 构造路径:
立即学习“Python免费学习笔记(深入)”;
import os
script_dir = os.path.dirname(os.path.abspath(__file__))
config_path = os.path.join(script_dir, "config.json")
with open(config_path) as f:
data = json.load(f)
Windows 下路径斜杠和编码容易出什么问题?
Windows 用户常遇到两个坑:__file__ 返回的路径含反斜杠 \,如果手动拼接字符串(比如 "C:\project\main.py")可能触发转义(\n 变成换行)。还有中文路径在旧版 Python 或某些终端下可能报 UnicodeDecodeError。
- 永远别手写带反斜杠的路径字面量;用
os.path.join()或pathlib.Path拼接 - 避免用
str(__file__)做路径操作;Python 3.6+ 推荐直接用pathlib.Path(__file__).parent - 打开文件时显式指定
encoding="utf-8",尤其路径含中文时
为什么不用 inspect.getfile(inspect.currentframe())?
它确实也能拿到当前文件路径,但比 __file__ 重、慢,且在某些优化场景(如 python -O)下可能失效。更重要的是,它在 Sublime Text 的 Build System 中行为不稳定 —— 某些自定义构建脚本会干扰帧对象,导致抛 TypeError 或返回 <string></string> 这类无效值。
__file__ 是语言级保证存在的模块属性,只要不是纯字符串 exec(比如 exec("print(1)") ),就一定可用。简单任务没必要绕远路。
路径这事看着小,但一旦涉及读配置、写日志、导入同级模块,错一点就全崩。记住:信 __file__,别信当前工作目录,也别信直觉拼的字符串。


















