You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python子目录脚本加载Pickle文件时触发FileNotFoundError问题

解决Python脚本加载Pickle文件的路径问题

问题背景

在GUI编辑器项目中,子目录的脚本加载Pickle文件时出现FileNotFoundError,相对路径的有效性依赖当前工作目录:

  • 子目录移出工作区时,直接用文件名加载文件正常;
  • 子目录在工作区内时,添加子目录名称作为路径前缀可行,但移出工作区后失效。

报错信息:

Traceback (most recent call last):
  File "d:\Projects\PyEngine\TestProject\main.py", line 12, in <module>
    objects = load_data("objects.pkl")
              ^^^^^^^^^^^^^^^^^^^^^^^^
  File "d:\Projects\PyEngine\TestProject\engineFunctions.py", line 12, in load_data
    with open(path, "rb") as file:
         ^^^^^^^^^^^^^^^^
FileNotFoundError: [Errno 2] No such file or directory: 'objects.pkl'

问题根源

Python的相对路径是基于运行脚本时的当前工作目录,而非脚本文件自身所在的目录。当工作目录变化(比如从不同位置启动脚本、移动项目文件夹),相对路径指向的位置就会出错。

解决方案:使用基于脚本目录的绝对路径

通过获取脚本自身的绝对路径,拼接数据文件路径,确保无论工作目录如何变化,都能准确定位文件。

方式1:使用pathlib(推荐,Python 3.4+)

修改子目录folder/main.py的代码:

import pickle
from pathlib import Path

class RandomObject:
    def __init__(self) -> None:
        self.name = "Random Object"

def load_data(path):
    with open(path, "rb") as file:
        data = pickle.load(file)
    return data

# 获取当前脚本所在目录
script_dir = Path(__file__).parent
# 拼接数据文件的绝对路径
data_path = script_dir / "data.pkl"

data = load_data(data_path)
print(data.name)

方式2:使用os.path(兼容旧版本Python)

修改子目录folder/main.py的代码:

import pickle
import os

class RandomObject:
    def __init__(self) -> None:
        self.name = "Random Object"

def load_data(path):
    with open(path, "rb") as file:
        data = pickle.load(file)
    return data

# 获取当前脚本的绝对路径,再提取所在目录
script_dir = os.path.dirname(os.path.abspath(__file__))
# 拼接数据文件的绝对路径
data_path = os.path.join(script_dir, "data.pkl")

data = load_data(data_path)
print(data.name)

主目录脚本的适配

主目录main.py也可以用同样方式定位子目录文件,避免依赖工作目录:

import pickle
from pathlib import Path

class RandomObject:
    def __init__(self) -> None:
        self.name = "Random Object"

def save_data(data, path):
    with open(path, "wb") as file:
        pickle.dump(data, file)

def load_data(path):
    with open(path, "rb") as file:
        data = pickle.load(file)
    return data

script_dir = Path(__file__).parent
data_path = script_dir / "folder" / "data.pkl"

data = RandomObject()
save_data(data, data_path)
data = load_data(data_path)
print(data.name)

额外注意事项

  • with语句会自动处理文件关闭,原代码中的file.close()属于冗余代码,可直接删除。
  • pathlib的路径拼接语法/跨平台兼容,无需手动处理Windows和Linux的路径分隔符差异。

内容的提问来源于stack exchange,提问作者igr2020

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 19:23:20