智核技术笔记

返回文章列表

脚本在自己的目录里能读到配置,换一个目录执行就报「找不到文件」。路径字符串没改过,变化的是程序把它当成相对路径时的起点。把这个起点说清楚,这类问题就比较好判断。

两种路径差在哪

绝对路径从盘符或根目录写起,本身就能定位到一个位置。Windows 上 I:\vps\aicore-site\examples\app.json 是绝对路径,Linux 上 /srv/aicore/app.json 也是。

相对路径没有这个起点,例如 examples\app.json 或 ../config/app.json。它相对的是进程的当前工作目录,不是脚本文件所在的目录,也不是用户主目录。

在项目目录 I:\vps\aicore-site 里,相对路径 examples\app.json 会落到 I:\vps\aicore-site\examples\app.json。把当前目录换成别的地方再执行同一条命令,它会改到新目录下面的 examples\app.json,原来的文件还在原地,只是这条相对路径已经不指向它。

用一次小程序看清楚

下面的程序使用 Python 标准库 pathlib,在 Python 3.14.3 里运行过。它同时打印三种写法:

from pathlib import Path

def describe(label: str, path: Path) -> None:
    resolved = path.resolve()
    print(label)
    print(f"  写法:{path}")
    print(f"  是否绝对路径:{path.is_absolute()}")
    print(f"  解析结果:{resolved}")
    print(f"  文件存在:{resolved.is_file()}")

here = Path(__file__).resolve().parent
describe("脚本所在目录下的配置", here / "app.json")
describe("从当前工作目录出发的相对路径", Path("examples") / "app.json")
python

Path(__file__).resolve().parent 取的是这个脚本自己所在的目录,和从哪里启动无关。Path("examples") / "app.json" 则从当前工作目录往下找。

在项目目录执行时,两种写法都能找到文件。换到另一个目录、用绝对路径启动同一个脚本时,第一种仍然指向脚本旁边的 app.json,第二种会指向新工作目录下的 examples\app.json,is_file() 变成假。

所以配置、模板、数据文件如果和脚本放在一起,就从 __file__ 出发去拼,不要从「我以为的当前目录」出发。

拼接时别用手写斜杠

不同系统的分隔符不一样。Windows 常见反斜杠,站点路径和 Linux 用正斜杠。用字符串相加很容易拼出 examplesapp.json,或者在中间多出两层分隔符。

pathlib 的 / 负责插入当前系统的分隔符:

config = Path(__file__).resolve().parent / "app.json"
python

需要把路径交给只接受字符串的旧接口时,最后再 str(config)。在那之前尽量让它保持为路径对象,存在性用 is_file()、is_dir() 判断,不要先换成字符串再到处拼接。

常见错误

  • 把相对路径写进开机自启、计划任务或服务配置里。这些程序的当前目录常常是系统目录,不是你开发时的项目目录。
  • 用 .. 连续向上跳,例如 ../../../../data。目录一调整,这条路径就指向项目外面,甚至指向不该读的位置。
  • 把用户输入直接接在基础目录后面。规范化之后如果结果不在预定目录里,应拒绝访问,而不是继续打开。
  • 只比较路径字符串。.\app.json 和 app.json 写法不同,解析后可能是同一个文件。比较前先 resolve()。
  • 忽略大小写差异。Windows 的路径比较通常不区分大小写,Linux 区分。同一套代码换系统后,Config.json 和 config.json 不会自动当成同一个文件。

从计划任务或服务里启动程序时,优先把要读的文件写成绝对路径,或者在启动命令里明确设置工作目录。不要依赖「上次在终端里 cd 到了哪里」。

小结

相对路径的起点是当前工作目录,不是脚本所在目录。和程序放在一起的文件,从脚本位置拼过去;交给系统长期运行的任务,把路径写绝对,并在启动时打印解析后的结果。路径出问题时,先打印「原始写法、是否绝对、解析结果、文件是否存在」这四项,比反复改斜杠方向更快。

文件路径、相对路径与绝对路径的常见问题
https://www.aicore.icu/blog/file-paths
作者 智核技术笔记
发布于 2026年10月26日