首页 > 编程问答 >我想参数化我的 pipeline.yaml 文件,但 Ploomber 无法读取我的 env.yaml 文件

我想参数化我的 pipeline.yaml 文件,但 Ploomber 无法读取我的 env.yaml 文件

时间:2024-08-01 15:21:00浏览次数:13  
标签:python jinja2 parameterization

我使用诗歌。它在目录中。然后创建了一个子目录(名为“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
  1. 当我尝试时:

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”

  1. 当我在名称更改后尝试 (来自 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 的查找方式如下:

  1. 当前工作目录: Ploomber 首先在运行命令的目录(在本例中为“src_common”)中查找环境文件。
  2. 项目根目录: 如果在当前目录中找不到,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 )。

标签:python,jinja2,parameterization
From: 78819557

相关文章

  • C++11 中的 python 海象运算符 (:=) 等效吗?
    最近我在Python中经常使用:=运算符,这样:ifmy_object:=SomeClass.function_that_returns_object():#dosomethingwiththisobjectifitexistsprint(my_object.some_attribute)问题有没有办法在c++11中做到这一点而不使用stdlib?例如......
  • Python 自动创建阿里云 OSS 桶并配置静态网站托管
    在本文中,我们将介绍如何使用Python和阿里云OSSSDK自动创建OSS桶(如果不存在),并为新创建的桶配置静态网站托管。这对于自动化部署和管理静态网站非常有用。前提条件安装阿里云OSSSDK:pipinstalloss2准备好阿里云OSS的访问密钥(AccessKeyID和AccessKeySecret......
  • visual studio 2019下Python的开发环境搭建
    Python的开发环境有各种各样的,在Windows下可以通过各种IDE(IIntegratedDevelopmentEnvironment)来进行开发,比如Pycharm,Spyder,Thonny,Eclipse+PyDev等等一些琳琅满目的编辑器,当然还有我的选择VisualStudio。之所以会选择VS,是因为VS本身就是一个功能非常强大的集成开发环境,其优......
  • 用Python编写你的网络监控系统详解
    概要在现代网络管理中,实时监控网络流量和状态是保证网络正常运行的关键。使用Python编写网络监控工具可以帮助管理员及时发现和解决网络问题。本文将详细介绍如何使用Python编写网络监控工具,包括基本概念、常用库及其应用场景,并提供相应的示例代码。网络监控的基本概念网......
  • Python WSGI服务器库之gunicorn使用详解
    概要在部署PythonWeb应用程序时,选择合适的WSGI服务器是关键的一步。Gunicorn(GreenUnicorn)是一个高性能、易于使用的PythonWSGIHTTP服务器,适用于各种应用部署场景。Gunicorn设计简洁,支持多种工作模式,能够有效地管理和处理大量并发请求。本文将详细介绍Gunicorn......
  • 基于python电影播放平台的设计与实现【源码+文档+PPT】
    ......
  • Python中FastAPI项目使用 Annotated的参数设计
    在FastAPI中,你可以使用PEP593中的Annotated类型来添加元数据到类型提示中。这个功能非常有用,因为它允许你在类型提示中添加更多的上下文信息,例如描述、默认值或其他自定义元数据。FastAPI支持Annotated类型,这使得你可以为路径操作函数的参数提供额外的元数据,例如依赖项、查询参......
  • 三种语言实现计算二进制中1的个数(C++/Python/Java)
    题目给定一个长度为n的数列,请你求出数列中每个数的二进制表示中1的个数。输入格式第一行包含整数n。第二行包含n个整数,表示整个数列。输出格式共一行,包含n个整数,其中的第i个数表示数列中的第i个数的二进制表示中1的个数。数据范围1≤n≤100000,0≤数列中......
  • 三种语言实现双指针判断子序列(C++/Python/Java)
    题目给定一个长度为n的整数序列a1,a2,…,an以及一个长度为m的整数序列b1,b2,…,bm。请你判断a序列是否为b序列的子序列。子序列指序列的一部分项按原有次序排列而得的序列,例如序列{a1,a3,a5}是序列{a1,a2,a3,a4,a5}的一个子序列。输入格式第一行包含两个整数......
  • 三种语言实现双指针解决数组元素的目标和(C++/Python/Java)
    题目给定两个升序排序的有序数组A和B,以及一个目标值x。数组下标从0开始。请你求出满足A[i]+B[j]=x的数对(i,j)。数据保证有唯一解。输入格式第一行包含三个整数n,m,x,分别表示A的长度,B的长度以及目标值x。第二行包含n个整数,表示数组A。第三行包含m个整数......