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

调用pickle相关函数触发FileNotFoundError问题求助

问题:Pickle保存文件时触发FileNotFoundError

报错信息

Traceback (most recent call last):
  File ".\scripts\pickle_threed_future_dataset.py", line 127, in <module>
    main(sys.argv[1:])
  File ".\scripts\pickle_threed_future_dataset.py", line 101, in main
    scenes_dataset = ThreedFront.from_dataset_directory(
  File "c:\users\mibig\desktop\atiss\scene_synthesis\datasets\threed_front.py", line 169, in from_dataset_directory
    scenes = parse_threed_front_scenes(
  File "c:\users\mibig\desktop\atiss\scene_synthesis\datasets\utils.py", line 129, in parse_threed_front_scenes
    pickle.dump(scenes, open("/tmp/threed_front.pkl", "wb"))
FileNotFoundError: [Errno 2] No such file or directory: '/tmp/threed_front.pkl'

出错代码片段

if os.getenv("PATH_TO_SCENES"):
        scenes = pickle.load(open(os.getenv("PATH_TO_SCENES"), "rb"))
    else:
    scenes = sum(scenes, [])
        pickle.dump(scenes, open("\tmp\threed_front.pkl", "wb"))

问题背景

刚接触conda/Python,按项目README说明,脚本应自动生成tmp/threed_front.pkl文件,再将该文件路径设为PATH_TO_SCENES环境变量,但实际找不到/tmp目录及对应.pkl文件;手动创建/tmp文件夹、修改代码为绝对路径后仍报错。


原因分析与解决方向

核心原因

  1. 跨平台路径不兼容:代码里的/tmp是Unix/Linux风格的临时目录路径,Windows系统没有这个根目录,会被解析为C盘根目录下的tmp文件夹(默认不存在);另外代码里的\tmp是转义字符,实际会被解析成tmp(不是合法路径),导致找不到目录。
  2. 代码缩进错误:提供的代码片段中,else块下的scenes = sum(scenes, [])和pickle.dump缩进混乱,pickle.dump未被包含在else块内,逻辑执行出错。
  3. 权限或路径存在性问题:即使手动创建目录,可能因权限不足无法写入,或者路径拼写错误导致找不到。

具体解决步骤

1. 修复路径问题(跨平台兼容)

推荐用Python内置的tempfile模块自动获取系统临时目录,无需手动适配系统:

import tempfile
import os

# 获取系统默认临时目录(Windows下是C:\Users\你的用户名\AppData\Local\Temp)
tmp_dir = tempfile.gettempdir()
# 拼接pkl文件路径
pkl_path = os.path.join(tmp_dir, "threed_front.pkl")
# 保存文件
pickle.dump(scenes, open(pkl_path, "wb"))

或者直接指定项目目录下的临时文件夹(确保有读写权限):

import os

# 先创建tmp目录(不存在则创建)
os.makedirs("./tmp", exist_ok=True)
# 保存到项目根目录的tmp文件夹
pickle.dump(scenes, open("./tmp/threed_front.pkl", "wb"))

2. 修正代码缩进错误

else块内的代码必须统一缩进,正确代码如下:

if os.getenv("PATH_TO_SCENES"):
    scenes = pickle.load(open(os.getenv("PATH_TO_SCENES"), "rb"))
else:
    scenes = sum(scenes, [])
    pickle.dump(scenes, open("./tmp/threed_front.pkl", "wb"))

3. 设置环境变量

生成pkl文件后,在conda环境中设置PATH_TO_SCENES:

  • Windows命令行(激活conda环境后):
    set PATH_TO_SCENES=你的pkl文件绝对路径(比如C:\users\mibig\desktop\atiss\tmp\threed_front.pkl)
    
  • 若要永久设置conda环境变量,可执行:
    conda env config vars set PATH_TO_SCENES=你的pkl文件绝对路径
    
    设置后重启conda环境生效。

4. 检查权限与路径

  • 不要将文件放在C盘根目录等需要管理员权限的位置,优先放在自己的用户目录(比如Desktop下的项目文件夹);
  • 手动验证路径是否存在:复制代码中的路径到文件资源管理器,确认能打开对应的文件夹。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 17:42:25