我使用诗歌。它在目录中。然后创建了一个子目录(名为“src”),Ploomber 在该子目录中正常工作,加载正确的文件。
但是当我在与第一个子目录(“src”相同的级别)创建第二个子目录(名为“src_common”)时"),我遇到了问题:
- ploomber 无法正确加载第二个子目录(“src_common”)中的参数化文件(env.yaml)。
My pipeline.yaml file是:
tasks:
- source: tasks/get_papers_common.py
product:
nb: output/get_papers_common.ipynb
data: output/openalex_papers.xlsx
- params:
openalex_search_url: "{{openalex_search_url}}"
openalex_filter: "{{openalex_filter}}"
publication_year: "{{publication_year}}"
work_type: "{{work_type}}"
grants_award_id: "{{grants_award_id}}"
openalex_keywords: "{{openalex_keywords}}"
more_keywords: "{{more_keywords}}"
sort: "{{sort}}"
cursor: "{{cursor}}"
RESULTS_PER_PAGE: "{{RESULTS_PER_PAGE}}"
MAX_PAGE: "{{MAX_PAGE}}"
而我的 env.yaml 文件是:
openalex_search_url: https://api.openalex.org/works
openalex_filter: publication_year:{},type:{},grants.award_id:{},default.search:{},fulltext.search:{}
publication_year: >2000
work_type: article|review
grants_award_id: 310584|646221|604134|760840|686239|814426|814401|814425|760813|760928|862296|862195|862419|953183|952924|952921|964766|965196|965367|964827|965173|964766|101092164|965196|965367|964827|965173
openalex_keywords: 'surface area' AND 'nanoparticle'
more_keywords : exposure
sort: display_name:desc
RESULTS_PER_PAGE: 200
cursor : *
MAX_PAGE: 150
- 当我尝试时:
ploomber build -e env.yaml --entry-point pipeline_common.yaml --force
我得到: 回溯(最近一次调用最后一次): 文件“D:\IDEA_on_D\Harmless\T775.venv\Lib\site-packages\ploomber\env\envdict.py”,第 396 行,位于 load_from_source 中 raw = yaml.load(f, Loader=yaml.SafeLoader) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 文件“D:\IDEA_on_D\Harmless\T775.venv\Lib\site-packages\yaml_ init _.py”,第 79 行,加载中 加载器 = 加载器(流) ^^^^^^^^^^^^^^^ 文件“D:\IDEA_on_D\Harmless\T775.venv\Lib\site-packages\yaml\loader.py”,第 34 行, init Reader。 init (self,流) 文件“D:\IDEA_on_D\Harmless\T775.venv\Lib\site-packages\yaml\reader.py”,第 85 行, init self.define_encoding() 文件“D:\ IDEA_on_D \ Harmless \ T775.venv \ Lib \ site-packages \ yaml \ reader.py”,第124行,在define_encoding中 self.update_raw() 文件“D:\IDEA_on_D\Harmless\T775.venv\Lib\site-packages\yaml\reader.py”,第 178 行,位于 update_raw 中 数据 = self.stream.read(大小) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 文件“C:\Users\dobromir\AppData\Local\Programs\Python\Python311\Lib\encodings\cp1252.py”,第 23 行,解码 返回 codecs.charmap_decode(input,self.errors,decoding_table)[0] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^ UnicodeDecodeError : 'charmap' 编解码器无法解码位置 479 中的字节 0x81: 字符映射到
在处理上述异常期间,发生了另一个异常:
Traceback (大多数最近通话最后): 文件“D:\IDEA_on_D\Harmless\T775.venv\Lib\site-packages\ploomber\env\envdict.py”,第 398 行,位于 load_from_source 中 加注类型(e)( ^^^^^^^^ TypeError :函数恰好需要 5 个参数(给定 1 个)
在处理上述异常期间,发生了另一个异常:
Traceback(最近一次调用最后): 文件“D:\IDEA_on_D\Harmless\T775.venv\Lib\site-packages\ploomber\cli\io.py”,第 54 行,包装器中 fn(**kwargs) 文件“D:\IDEA_on_D\Harmless\T775.venv\Lib\site-packages\ploomber_core\telemetry\telemetry.py”,第 698 行,包装器中 结果 = func(_payload, *args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 文件“D:\IDEA_on_D\Harmless\T775.venv\Lib\site-packages\ploomber\cli\build.py”,第 69 行,在 main 中 dag, args = parser.load_from_entry_point_arg() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 文件“D:\IDEA_on_D\Harmless\T775.venv\Lib\site-packages\ploomber\cli\parsers.py”,第 225 行,位于 load_from_entry_point_arg dag, args = load_dag_from_entry_point_and_parser(entry_point, self, sys.argv) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^ 文件“D:\IDEA_on_D\Harmless\T775.venv\Lib\site-packages\ploomber\cli\parsers.py”,第 503 行,位于 load_dag_from_entry_point_and_parser 中 dag, args = _process_file_dir_or_glob(解析器) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 文件“D:\IDEA_on_D\Harmless\T775.venv\Lib\site-packages\ploomber\cli\parsers.py”,第 421 行,在 _process_file_dir_or_glob 中 env_dict = EnvDict( ^^^^^^^^ 文件“D:\IDEA_on_D\Harmless\T775.venv\Lib\site-packages\ploomber\env\envdict.py”,第 110 行,在 init ) = load_from_source(source) ^^^^^^^^^^^^^^^^^^^^^^^^^^ 文件“D:\IDEA_on_D\Harmless\T775.venv\Lib\site-packages\ploomber\env\envdict.py”,第 406 行,位于 load_from_source 中 如果不是 isinstance(原始,映射): ^^^ UnboundLocalError :无法访问未与值关联的局部变量“raw”
- 当我在名称更改后尝试 仅 (来自 env. yaml to env_common.yaml ) 我得到:
ploomber build -e env_common.yaml --entry-point pipeline_common.yaml --force
错误 :替换占位符时出错:
- {{openalex_search_url}}:确保在环境中定义占位符
加载的环境:EnvDict({'cwd': 'D:\IDEA_on_...5\src_common', 'git': 'general_two_level_search ', 'git_hash': '3ee1ac2-dirty', '此处': 'D:\IDEA_on_...5\src_common', ...})
问题的原因是 Ploomber 在的“src_common”子目录中找不到的
env.yaml
或
env_common.yaml
文件。Ploomber 的查找方式如下:
- 当前工作目录: Ploomber 首先在运行命令的目录(在本例中为“src_common”)中查找环境文件。
- 项目根目录: 如果在当前目录中找不到,Ploomber 将向上搜索目录树,直到找到“pipeline.yaml”文件,然后在该目录中查找环境文件。
基于的描述,的“env_common.yaml” 文件位于“src_common”目录中,但 Ploomber 在那里找不到它。这可能是因为的编码问题或 Ploomber 没有从正确的目录中运行。
以下是一些解决方法:
1. 指定环境文件的完整路径:
这可以确保 Ploomber 找到正确的文件,无论当前工作目录如何。
bash
ploomber build --environment D:\IDEA_on_D\Harmless\T775\src_common\env_common.yaml --entry-point pipeline_common.yaml --force
2. 从项目根目录运行 Ploomber:
导航到包含“pipeline.yaml”的目录,然后运行的 Ploomber 命令。这将确保 Ploomber 在正确的目录中查找“env_common.yaml”文件。
bash
cd D:\IDEA_on_D\Harmless\T775
ploomber build -e src_common/env_common.yaml --entry-point src_common/pipeline_common.yaml --force
3. 确保的
env_common.yaml
文件使用 UTF-8 编码:
UnicodeDecodeError
表明的文件可能使用了不同的编码。请使用文本编辑器(如 Notepad++ 或 VS Code)打开
env_common.yaml
文件,并确保其编码设置为 UTF-8。
其他建议:
-
打印工作目录:
在的管道中添加一个 Python 任务,用于打印
os.getcwd()
,以验证 Ploomber 的工作目录。 - 检查隐藏文件: 确保的环境文件没有被意外隐藏。
一旦解决了环境文件路径问题,请确保在的
pipeline.yaml
文件中使用正确的环境文件名称 (
env_common.yaml
)。