
本文收录于 《全栈 Bug 调优实战版》 专栏。专栏聚焦真实项目中的各类疑难 Bug从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者还是负责复杂项目的资深工程师都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论助你稳步进阶、放大技术价值。特别说明文中问题案例来源于真实生产环境与公开技术社区并结合多位一线资深工程师与架构师的长期实践经验经过人工筛选与AI系统化智能整理后输出。文中的解决方案并非唯一“标准答案”而是兼顾可行性、可复现性与思路启发性的实践参考供你在实际项目中灵活运用与演进。欢迎订阅本专栏一次订阅后专栏内所有文章可永久免费阅读后续更新内容皆不用再次订阅持续更新中。 问题描述详细问题描述如下data-juicer运行报错日志文件路径无法找到data-juicer日志文件路径出现了问题按照官方网站的技术文档的uv pip方式下载的data-juicer运行后出现报错如何解决配置文件如下project_name:windows-fixdataset_path:D:/WorkRes/EnvDataJuicer/dj-practice/raw_data.jsonlnp:4export_path:D:/WorkRes/EnvDataJuicer/dj-practice/processed_data.jsonlprocess:-language_id_score_filter:lang:zhmin_score:0.8(D:\WorkRes\condaData\envs_dirs\env2-dj)PSD:\WorkRes\EnvDataJuicer\dj-practicedj-process--config.\process.yaml2026-03-2014:18:24.879|ERROR|__main__:10-An error has been caughtinfunctionmodule,processMainProcess(16736),threadMainThread(30512):Traceback(most recent call last):FileD:\WorkRes\condaData\envs_dirs\env2-dj\lib\runpy.py,line196,in_run_module_as_mainreturn_run_code(code,main_globals,None,│ │ └{__name__:__main__,__doc__:None,__package__:,__loader__:zipimporter object D:\WorkRes\condaData\envs_dir...│ └code objectmoduleat0x000001A6B57DFD60,fileD:\WorkRes\condaData\envs_dirs\env2-dj\Scripts\dj-process.exe\__main__.py...└function_run_code at0x000001A6B557F640FileD:\WorkRes\condaData\envs_dirs\env2-dj\lib\runpy.py,line86,in_run_codeexec(code,run_globals)│ └{__name__:__main__,__doc__:None,__package__:,__loader__:zipimporter object D:\WorkRes\condaData\envs_dir...└code objectmoduleat0x000001A6B57DFD60,fileD:\WorkRes\condaData\envs_dirs\env2-dj\Scripts\dj-process.exe\__main__.py...FileD:\WorkRes\condaData\envs_dirs\env2-dj\Scripts\dj-process.exe\__main__.py,line10,inmodulesys.exit(main())│ │ └functionmain at0x000001A6A7A15C60│ └built-infunctionexit└modulesys(built-in)FileD:\WorkRes\condaData\envs_dirs\env2-dj\Lib\site-packages\tools\process_data.py,line21,inmain cfginit_configs()└functioninit_configs at0x000001A69E5049D0FileD:\WorkRes\condaData\envs_dirs\env2-dj\lib\site-packages\data_juicer\config\config.py,line824,ininit_configs cfginit_setup_from_cfg(cfg,load_configs_only)│ │ └ False │ └Namespace(config[Path_fr(.\process.yaml,cwdD:\WorkRes\EnvDataJuicer\dj-practice)],autoFalse,auto_num1000,hpo_configN...└functioninit_setup_from_cfg at0x000001A69E504F70FileD:\WorkRes\condaData\envs_dirs\env2-dj\lib\site-packages\data_juicer\config\config.py,line920,ininit_setup_from_cfgsetup_logger(└functionsetup_logger at0x000001A69C3383A0FileD:\WorkRes\condaData\envs_dirs\env2-dj\lib\site-packages\data_juicer\utils\logger_utils.py,line170,insetup_logger logger.add(│ └functionLogger.add at0x000001A6B76FE680└loguru.logger handlers[(id2,level20,sinkstderr)]FileD:\WorkRes\condaData\envs_dirs\env2-dj\lib\site-packages\loguru\_file_sink.py,line192,in__init__ self._create_file(path)│ │ └D:\\WorkRes\\EnvDataJuicer\\dj-practice\\20260320_061824_de1d34\\logs\\export_..\\processed_data.jsonl_time_20260320141824.txt│ └functionFileSink._create_file at0x000001A6B76917E0└loguru._file_sink.FileSink object at0x000001A6A7B5D450FileD:\WorkRes\condaData\envs_dirs\env2-dj\lib\site-packages\loguru\_file_sink.py,line228,in_create_file self._fileopen(path,**self._kwargs)│ │ │ │ └{mode:a,buffering:1,encoding:utf8}│ │ │ └loguru._file_sink.FileSink object at0x000001A6A7B5D450│ │ └D:\\WorkRes\\EnvDataJuicer\\dj-practice\\20260320_061824_de1d34\\logs\\export_..\\processed_data.jsonl_time_20260320141824.txt│ └ None └loguru._file_sink.FileSink object at0x000001A6A7B5D450FileNotFoundError:[Errno2]No such file or directory:D:\\WorkRes\\EnvDataJuicer\\dj-practice\\20260320_061824_de1d34\\logs\\export_..\\processed_data.jsonl_time_20260320141824.txtTraceback(most recent call last):FileD:\WorkRes\condaData\envs_dirs\env2-dj\lib\runpy.py,line196,in_run_module_as_mainreturn_run_code(code,main_globals,None,FileD:\WorkRes\condaData\envs_dirs\env2-dj\lib\runpy.py,line86,in_run_codeexec(code,run_globals)FileD:\WorkRes\condaData\envs_dirs\env2-dj\Scripts\dj-process.exe\__main__.py,line10,inmodulesys.exit(main())FileD:\WorkRes\condaData\envs_dirs\env2-dj\lib\site-packages\loguru\_logger.py,line1297,incatch_wrapperreturnfunction(*args,**kwargs)FileD:\WorkRes\condaData\envs_dirs\env2-dj\Lib\site-packages\tools\process_data.py,line21,inmain cfginit_configs()FileD:\WorkRes\condaData\envs_dirs\env2-dj\lib\site-packages\data_juicer\config\config.py,line824,ininit_configs cfginit_setup_from_cfg(cfg,load_configs_only)FileD:\WorkRes\condaData\envs_dirs\env2-dj\lib\site-packages\data_juicer\config\config.py,line920,ininit_setup_from_cfgsetup_logger(FileD:\WorkRes\condaData\envs_dirs\env2-dj\lib\site-packages\data_juicer\utils\logger_utils.py,line170,insetup_logger logger.add(FileD:\WorkRes\condaData\envs_dirs\env2-dj\lib\site-packages\loguru\_logger.py,line802,inadd wrapped_sinkFileSink(path,**kwargs)FileD:\WorkRes\condaData\envs_dirs\env2-dj\lib\site-packages\loguru\_file_sink.py,line192,in__init__ self._create_file(path)FileD:\WorkRes\condaData\envs_dirs\env2-dj\lib\site-packages\loguru\_file_sink.py,line228,in_create_file self._fileopen(path,**self._kwargs)FileNotFoundError:[Errno2]No such file or directory:D:\\WorkRes\\EnvDataJuicer\\dj-practice\\20260320_061824_de1d34\\logs\\export_..\\processed_data.jsonl_time_20260320141824.txt全文目录 问题描述 请知悉如下方案不保证一定适配你的问题✅️问题理解方案 A显式把 export_path 放进最终 work_dir这是最推荐、最稳的修复方案方案 B升级到当前最新版本但把它当“补强”不要把它当这次问题的唯一修复手段方案 C本地补丁修源码适合你要批量兼容旧配置或必须保留现有路径布局时使用✅️问题延伸✅️问题预测✅️小结 结语 互动说明 文末福利技术成长加速包 Who am I? 请知悉如下方案不保证一定适配你的问题如下是针对上述问题进行专业角度剖析答疑不喜勿喷仅供参考✅️问题理解你这个报错本质上不是数据集文件找不到也不是language_id_score_filter本身有问题更不是uv pip安装方式直接装坏了。从你贴出的堆栈看程序还没真正开始处理数据就已经在初始化日志文件的阶段挂掉了调用链是init_configs - init_setup_from_cfg - setup_logger - loguru FileSink open(...)也就是说失败点发生在正式执行 OP 之前。结合 Data-Juicer 当前主线代码init_setup_from_cfg会先处理export_path、work_dir、job_id和event_log_dir然后用os.path.relpath(cfg.export_path, startcfg.work_dir)计算相对路径再把它拼进日志文件名里而setup_logger最终会把save_dir和这个文件名os.path.join后交给 Loguru 打开。你的堆栈里最关键的一段是这个路径D:\WorkRes\EnvDataJuicer\dj-practice\20260320_061824_de1d34\logs\export_..\processed_data.jsonl_time_20260320141824.txt这已经把问题暴露得很清楚了Data-Juicer 先把work_dir变成了一个自动追加了job_id的运行目录例如...\dj-practice\20260320_061824_de1d34而你的export_path仍然是外层目录里的...\dj-practice\processed_data.jsonl。这样一来os.path.relpath(export_path, work_dir)在 Windows 下就会算出..\processed_data.jsonl。随后 Data-Juicer 把它拼成日志文件名export_..\processed_data.jsonl_time_xxx.txtLoguru 又把这个“文件名”当作了带目录层级的路径去打开于是中间目录并不存在最终触发FileNotFoundError。这和 Data-Juicer 当前配置解析逻辑完全吻合如果work_dir不含{job_id}占位符框架会自动把job_id追加到末尾同时它确实会对work_dir、export_path等字段做占位符替换。所以这次报错的真正根因是export_path不在最终运行态的work_dir内部导致生成日志文件名时出现了..\\从而把“日志文件名”污染成了非法/不存在的层级路径。这也是为什么你会感觉像“日志文件路径无法找到”——其实不是普通意义上的“logs 目录没建”而是日志“文件名”里被塞进了相对路径穿越符号..和路径分隔符。下面这个流程能直观看懂这次故障链路### ✅️问题解决方案方案 A显式把export_path放进最终work_dir这是最推荐、最稳的修复方案这是最应该采用的方案。Data-Juicer 当前代码明确支持对work_dir、export_path、dataset_path、event_log_dir等字段做{job_id}/{work_dir}占位符替换同时它要求最终work_dir以job_id结尾或者自动帮你追加一个job_id。因此正确做法不是只写死export_path而是让export_path跟随最终运行目录一起解析出来。你可以直接把配置改成下面这样project_name:windows-fixdataset_path:D:/WorkRes/EnvDataJuicer/dj-practice/raw_data.jsonlwork_dir:D:/WorkRes/EnvDataJuicer/dj-practice/runs/{job_id}export_path:{work_dir}/processed_data.jsonlnp:4process:-language_id_score_filter:lang:zhmin_score:0.8这个配置为什么能解决第一work_dir已经明确写成以{job_id}结尾符合框架自己的目录规则。第二export_path直接引用{work_dir}这样替换完成后导出文件就一定落在该次运行目录里面。第三这样os.path.relpath(cfg.export_path, startcfg.work_dir)的结果就不再是..\processed_data.jsonl而会变成单纯的processed_data.jsonl日志文件名也就会是正常的logs/export_processed_data.jsonl_time_xxx.txt。这正好绕开了你现在的异常路径构造。这里我再强调一个很容易踩坑的点不要只写work_dir: D:/.../dj-practice然后export_path: D:/.../dj-practice/processed_data.jsonl以为这样就行。因为当前代码会在后面自动把job_id追加到work_dir末尾最终work_dir会变成.../dj-practice/job_id而你的export_path仍然在上一级目录结果相对路径还是会变成..\processed_data.jsonl。所以最稳妥的写法就是我上面给你的这种work_dir自己带{job_id}export_path再引用{work_dir}。你可以改完后直接重新执行dj-process--config.\process.yaml方案 B升级到当前最新版本但把它当“补强”不要把它当这次问题的唯一修复手段Data-Juicer 官方当前推荐的安装方式确实是uv pipinstallpy-data-juicer而 PyPI 上当前最新版本是py-data-juicer 1.5.1发布时间为 2026-03-17。此外官方仓库在 2025 年曾有人报告过一个相近的日志文件FileNotFoundError问题维护者回复说“最近一个 PR 已修复建议拉最新代码再试”。这说明日志相关问题在 Data-Juicer 里确实出现过而且官方也持续在修。但是要非常客观地说升级版本并不能替代你这次的配置修正。原因是你这次的问题并不是单纯“某个日志文件没有自动创建”而是日志文件名本身被构造成了带..\的路径。只要你的export_path仍然落在最终work_dir外面这个风险依旧成立。也就是说低版本更容易撞日志相关 bug高版本稳定性更好但配置里如果依然让export_path跑到最终work_dir外层仍然可能再出问题。所以这个方案正确的使用姿势是先查版本python-cimport importlib.metadata as m; print(m.version(py-data-juicer))如果不是最新再升级uv pip install-U py-data-juicer升级后仍然要配合方案 A 的 YAML 修正一起做。这样才是长期稳定的做法。方案 C本地补丁修源码适合你要批量兼容旧配置或必须保留现有路径布局时使用如果你现在有很多现成配置文件不想一个个改或者你就是想保留“导出文件在运行目录外层”的习惯那就可以考虑直接补 Data-Juicer 本地源码把日志文件名做一次“安全化处理”。当前主线逻辑核心是取export_rel_path os.path.relpath(cfg.export_path, startcfg.work_dir)生成logfile_name fexport_{export_rel_path}_time_{timestamp}.txtsetup_logger(save_dircfg.event_log_dir, filenamelogfile_name, ...)问题就在第 2 步它把一个可能含有..\、/、\的相对路径直接塞进了“文件名”里。你可以在本地安装包里把这一段修成“文件名安全化”例如改成如下思路export_rel_pathos.path.relpath(cfg.export_path,startcfg.work_dir)safe_export_rel_path(export_rel_path.replace(..,__).replace(\\,_).replace(/,_).replace(:,_))logfile_namefexport_{safe_export_rel_path}_time_{timestamp}.txt或者更保守一些直接只取导出文件名safe_export_rel_pathos.path.basename(cfg.export_path)logfile_namefexport_{safe_export_rel_path}_time_{timestamp}.txt这类补丁的优点是不需要改很多 YAML彻底杜绝日志文件名注入目录层级对 Windows 路径特别友好。缺点也很明显升级包后可能被覆盖属于“本地维护分支”后面要自己记得合并对团队协作不如改配置规范来得统一。所以我的建议是个人临时救火可用团队长期使用不推荐把它当第一方案。✅️问题延伸这个问题其实揭示了 Data-Juicer 1.x 一个非常重要的“运行目录模型”它不是把work_dir当普通静态目录而是把它当“某次作业的根目录模板”。当前代码里resolve_job_directories明确规定如果work_dir不带{job_id}它也会自动把job_id追加到末尾并且logs、checkpoints、partitions、metadata、results等目录都默认挂在这个最终work_dir下。也就是说每次执行本质上都是一个独立 job workspace。所以以后你写 Data-Juicer 配置时建议建立一个固定原则凡是“本次运行产生的输出”都尽量放在{work_dir}内部。一个推荐范式是work_dir:D:/xxx/runs/{job_id}export_path:{work_dir}/processed_data.jsonlevent_log_dir:{work_dir}/logscheckpoint_dir:{work_dir}/checkpointspartition_dir:{work_dir}/partitions这样你会得到以下收益日志、检查点、导出数据天然同属于一次 job清理历史运行非常方便不会再出现relpath回退到..的问题后续如果启用 checkpoint / tracer / ray也更不容易出奇怪路径问题。另外再提醒你一件“下一个可能遇到的问题”你现在用的是language_id_score_filter官方文档明确说明这个 OP 依赖FastText 语言识别模型如果本机缓存里没有相关模型Data-Juicer 运行时可能会去下载历史 issue 里也能看到lid.176.bin缺失后自动下载或手工放缓存目录的讨论。也就是说你这次修完日志路径后下一步如果网络不通可能会遇到模型下载或缓存相关报错但那已经是下一阶段的问题不是这次的根因。✅️问题预测基于你当前环境我很高概率预测后续会出现这几类情况第一修完 YAML 后本次FileNotFoundError会消失。因为这次错误完全卡在 logger 初始化阶段只要日志文件名不再含..\loguru就能正常建文件流程就能往后走。这个判断与你当前堆栈和 Data-Juicer 的路径生成逻辑完全一致。第二如果是第一次跑language_id_score_filter可能会出现模型缓存/下载相关耗时或报错。官方文档说明该算子使用 FastText 做语言识别历史 issue 里也出现过lid.176.bin不存在而触发下载的情况。第三如果你后面继续沿用“导出文件写在运行目录外层”的写法其他依赖work_dir的功能也可能继续出路径类问题。尤其是 checkpoint、event log、partition 等路径都围绕最终work_dir构建一旦你把运行输出散落到外层再遇到相对路径拼接就很容易再冒出同类 bug。第四升级版本值得做但不能替代配置规范。当前官方最新包是 1.5.1日志和执行框架近几个版本一直在持续修复与增强但只要路径组织方式本身不合理升级也不是银弹。✅️小结结论我给你直接下得非常明确一点这次不是你的数据文件路径错了而是 Data-Juicer 在“自动 job 工作目录 相对路径生成日志名”这一套逻辑下把你的export_path处理成了..\processed_data.jsonl最终污染了日志文件名导致 Loguru 去打开一个不存在的层级路径。最有效、最靠谱、最工程化的修法就是显式设置work_dir为带{job_id}的运行目录把export_path写成{work_dir}/processed_data.jsonl再顺手确认包版本必要时升级到最新。你现在直接把配置改成下面这一版基本就是正解project_name:windows-fixdataset_path:D:/WorkRes/EnvDataJuicer/dj-practice/raw_data.jsonlwork_dir:D:/WorkRes/EnvDataJuicer/dj-practice/runs/{job_id}export_path:{work_dir}/processed_data.jsonlnp:4process:-language_id_score_filter:lang:zhmin_score:0.8这版改完后再跑dj-process --config .\process.yaml大概率就会越过你现在这个报错点。 结语 互动说明希望以上分析与解决思路能为你当前的问题提供一些有效线索或直接可用的操作路径。若你按文中步骤执行后仍未解决不必焦虑或抱怨这很常见——复杂问题往往由多重因素叠加引起欢迎你将最新报错信息、关键代码片段、环境说明等补充到评论区我会在力所能及的范围内结合大家的反馈一起帮你继续定位 如果你有更优或更通用的解法非常欢迎在评论区分享你的实践经验或改进方案你的这份补充可能正好帮到更多正在被类似问题困扰的同学正所谓「赠人玫瑰手有余香」也算是为技术社区持续注入正向循环 文末福利技术成长加速包 文中部分问题来自本人项目实践部分来自读者反馈与公开社区案例也有少量经由全网社区与智能问答平台整理而来。若你尝试后仍没完全解决问题还请多一点理解、少一点苛责——技术问题本就复杂多变没有任何人能给出对所有场景都 100% 套用的方案。如果你已经找到更适合自己项目现场的做法非常建议你沉淀成文档或教程这不仅是对他人的帮助更是对自己认知的再升级。如果你还在持续查 Bug、找方案可以顺便逛逛我专门整理的 Bug 专栏《全栈 Bug 调优实战版》️这里收录的都是在真实场景中踩过的坑希望能帮你少走弯路节省更多宝贵时间。✍️如果这篇文章对你有一点点帮助欢迎给 bug菌 来个一键三连关注 点赞 收藏你的支持是我持续输出高质量实战内容的最大动力。同时也欢迎关注我的硬核公众号 「猿圈奇妙屋」获取第一时间更新的技术干货、BAT 等互联网公司最新面试真题、4000G 技术 PDF 电子书、简历 / PPT 模板、技术文章 Markdown 模板等资料通通免费领取。你能想到的绝大部分学习资料我都尽量帮你准备齐全剩下的只需要你愿意迈出那一步来拿。 Who am I?我是 bug菌热活跃于 CSDN | 掘金 | InfoQ | 51CTO | 华为云 | 阿里云 | 腾讯云 等技术社区CSDN 博客之星 Top30、华为云多年度十佳博主/卓越贡献者、掘金多年度人气作者 Top40掘金、InfoQ、51CTO 等平台签约及优质作者全网粉丝累计30w。更多高质量技术内容及成长资料可查看这个合集入口 点击查看 ️硬核技术公众号「猿圈奇妙屋」期待你的加入一起进阶、一起打怪升级。- End -