调用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文件夹、修改代码为绝对路径后仍报错。
原因分析与解决方向
核心原因
- 跨平台路径不兼容:代码里的
/tmp是Unix/Linux风格的临时目录路径,Windows系统没有这个根目录,会被解析为C盘根目录下的tmp文件夹(默认不存在);另外代码里的\tmp是转义字符,实际会被解析成tmp(不是合法路径),导致找不到目录。 - 代码缩进错误:提供的代码片段中,
else块下的scenes = sum(scenes, [])和pickle.dump缩进混乱,pickle.dump未被包含在else块内,逻辑执行出错。 - 权限或路径存在性问题:即使手动创建目录,可能因权限不足无法写入,或者路径拼写错误导致找不到。
具体解决步骤
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环境生效。conda env config vars set PATH_TO_SCENES=你的pkl文件绝对路径
4. 检查权限与路径
- 不要将文件放在C盘根目录等需要管理员权限的位置,优先放在自己的用户目录(比如Desktop下的项目文件夹);
- 手动验证路径是否存在:复制代码中的路径到文件资源管理器,确认能打开对应的文件夹。
内容的提问来源于stack exchange,提问作者kkkkkkkkkkkkkkkin
相关产品推荐
相关产品推荐

