20 分钟
工程化

路径与跨平台兼容

Windows/Linux 路径分隔符、相对路径陷阱、pathlib 最佳实践

  • 理解 Windows(\) 和 Linux(/) 路径差异
  • 掌握 os.path 和 pathlib 的用法
  • 避免相对路径的常见坑
  • 写出跨平台兼容的路径代码

路径与跨平台兼容

代码在Windows上跑没问题,部署到Linux服务器就报FileNotFoundError,大多是路径写死了反斜杠。

路径分隔符差异

示例代码(可运行)
💡pathlib 是现代 Python 的标准

Python 3.4+ 推荐用 pathlib 替代 os.path。/ 运算符拼接路径、.read_text()/.write_text() 直接读写、.glob() 查找文件、.mkdir(parents=True, exist_ok=True) 创建目录。代码更简洁、更安全、更面向对象。

相对路径的致命陷阱

Python
# 相对路径是相对于「当前工作目录」(CWD),不是脚本所在目录!
# 假设项目结构:
# /home/user/myapp/
# ├── main.py
# └── data/
#     └── config.json

# main.py 中:
import os
from pathlib import Path

# ❌ 危险:在不同目录下运行脚本会找不到文件
# cd /home/user && python myapp/main.py → CWD=/home/user
# cd /home/user/myapp && python main.py → CWD=/home/user/myapp
# with open("data/config.json") as f:  # 依赖 CWD!

# ✅ 正确:基于脚本文件位置构建路径
SCRIPT_DIR = Path(__file__).resolve().parent
config_path = SCRIPT_DIR / "data" / "config.json"
# 配置文件真实存在时再 open 读取;这里先演示:无论从哪个工作目录启动,拼出的路径都不变
print(config_path)

# __file__ 是当前脚本的路径
# .resolve() 转为绝对路径并解析符号链接
# .parent 是父目录
print(f"脚本目录: {SCRIPT_DIR}")
🚫工作中最常见的路径 Bug

本地运行正常,部署到服务器/Docker 后报找不到文件——几乎都是因为用了相对路径。就用 Path(__file__).resolve().parent 当锚点构建路径。

pathlib 常用操作

示例代码(可运行)

其他跨平台坑

示例代码(可运行)
选择题

跨平台拼接路径的最佳方式?

预测输出
from pathlib import Path
p = Path("/a/b/c.txt")
print(p.parent.name)

资深工程师加餐

底层原理 · 大厂视角 · 工程经验,点卡片展开

底层是大量、快速、稳定的单元测试(优先覆盖纯函数与边界/异常路径),中间是少量集成测试(验证模块协作),顶端是少量端到端测试(慢且脆)。测试最大的价值是当「安全网」:有它你才敢放心重构。没测试兜底的重构,本质是在赌博。写用例先想正常、边界、异常三类。

挑战任务

安全的配置文件路径

简单+50 XP

用 __file__ 来拼配置文件路径,不管当前工作目录是啥,都能找到文件。

安全的配置文件路径
2 个测试用例

课后作业

批量重命名工具

中等+20 XP

写个脚本,把指定目录下所有 .jpeg 文件重命名成 .jpg。

批量重命名工具
1 个测试用例