当前位置: 首页 > 面试题库 >

在dag之间使用单独的environ和sys.path

季凡
2023-03-14
问题内容
  • TLDR :该问题最初基于问题,后来被确定为该问题的标题更新。跳至“更新2”以获取最相关的问题详细信息。

有dag文件从另一个位置的另一个python文件中导入了dicts的python列表,并根据列表的dict值创建了dag,气流存在奇怪的问题,当我手动运行dag文件时,它看上去会有所不同。像…

...
environ["PROJECT_HOME"] = "/path/to/some/project/files"
# import certain project files
sys.path.append(environ["PROJECT_HOME"])
import tables as tt

tables = tt.tables

for table in tables:
    print table
    assert isinstance(table, dict)
    <create some dag task 1>
    <create some dag task 2>
    ...

~/airflow/dag/dir手动运行py文件时,没有引发任何错误,并且for循环将输出命令,但是气流显然会在Web服务器和运行时看到不同的内容airflow list_dags。运行airflow list_dags我得到错误

    assert isinstance(table, dict)
AssertionError

而且不知道如何测试这是什么原因,因为再次从dag位置手动运行py文件时,没有问题,并且print语句显示dicts,并且Web服务器UI也不显示其他错误消息。

有人知道这里会发生什么吗?也许关于进口如何运作?

  • 更新1

在从导入的python模块调用函数时,看到了更多的怪异之处,当手动运行dag文件时,一切运行正常,但是airflow list_dags说…

AttributeError:“模块”对象没有属性“ my_func”

使我更加怀疑某些导入异常,即使这与我在另一个dag文件中使用的完全相同的过程(即,设置一些environ值并附加到sys.path)为该dag导入模块也没有任何问题。

  • 更新2

问题似乎是(在错误的断言处打印各种sys.pathenvironmodule.__all__信息之后),
正在导入的名称相似的模块来自另一个 我执行了相同步骤的项目。就是 有另一个文件…

...
environ["PROJECT_HOME"] = "/path/to/some/project/files"
# import certain project files
sys.path.append(environ["PROJECT_HOME"])
import tables as tt

tables = tt.tables

for table in tables:
    print table
    assert isinstance(table, dict)
    <create some dag task 1>
    <create some dag task 2>
    ...

并且该项目主页正被用来下载一个类似命名的模块,该模块也具有一个obj,该obj的名称与我所期望的相同(即使在我将project文件夹插入之前sys.path)。除了制作打包的dag之外,还有一种方法可以防止气流组合不同dag的所有environsys.path值(因为我在各种bash和python任务脚本中使用$
PROJECT_HOME)?


问题答案:

为了从其他路径引入特定模块,我在这里使用解决方案通过指定其他python模块的绝对文件路径来导入它们。

为了使用不同的python解释器将各种python脚本作为气流任务运行,我做了类似…

do_stuff_a = BashOperator(
        task_id='my_task_a',
        bash_command='/path/to/virtualenv_a/bin/python /path/to/script_a.py'),
        execution_timeout=timedelta(minutes=30),
        dag=dag)

就像这里的类似问题一样



 类似资料:
  • 好的,所以我正在尝试编写一个高级函数,它使用两个不同的参数集名称,一个是另一个是。 这大部分工作都很好,但是,我的问题是: 的输出在部分给出了以下内容: 从外观上看,这正是我想要的--一个参数集,我可以在其中验证几个不同的列表,并在其中移动,我有密码、描述等;另一个参数集,我只验证的一个值,并有一个只属于参数集的参数。 不幸的是,在ISE中尝试测试时,如果输入: ,我从IntelliSense得到

  • 我试图允许nginx在多个容器之间代理,同时访问这些容器中的静态文件。 若要在使用docker compose创建的容器之间共享卷,请执行以下操作: 然而,我实际需要的是nginx compose文件在一个单独的文件中,也在一个完全不同的文件夹中。换句话说,命令将单独运行。我尝试了以下方法: 此处正确找到的一个工作是将nginx容器静态文件卷改为如下所示: 上面的方法是正确的,但是它看起来是“刺耳

  • 问题内容: 我有一个网络表单,用户可以在其中从日历弹出窗口中选择日期,并从下拉菜单中选择时间。目前,我正在尝试使用Date对象存储日期。 这个对象的输出类似于: 1970年1月1日,00:00:00 GMT 我真正想做的是将其分开并以类似 27/02/2013 的格式存储日期,并以24小时格式(例如 23:45) 将时间作为单独的对象。我不确定如何用Java做到这一点。 使用SimpleDateF

  • 我有一个带有签名字节的数组和一个带有ocsp字节的数组,用于将ltv信息添加到我的pdf中。该签名是时间戳签名。现在,我尝试将这些信息添加到一个pdf文件中,该文件可用于 ... 好的,这样行。但在签名中,我必须设置标志认证级别1(不允许更改),我的应用程序将无法工作。因为添加LTV后,我更改了文档。我尝试创建自己的DSS字典并将其添加到文档中,但失败了。有谁能帮忙吗?提前谢谢

  • 问题内容: 我想单独使用Django ORM。尽管搜索了一个小时的Google,但我仍然有几个问题: 是否需要我使用setting.py,/ myApp /目录和modules.py文件设置Python项目? 我可以创建一个新的并运行以使其自动设置表和关系,还是只能使用现有Django项目中的模型? 关于的问题似乎很多。如果你不调用现有模型,是否需要? 我想最简单的事情是让某人发布基本模板或流程的

  • 问题内容: 有人可以解释这个代码吗? 输出: 问题答案: 将对象转换为列表时,它仅使用键。 但是,如果用方括号将其包围,则所有内容都将保持不变,只会使其成为s的列表,其中仅包含一项。 这是因为,当您使用循环遍历时,它也只使用了键: 但是,如果要获取键 和 值,请使用: 使用循环: 但是,当您输入时,它会为您提供: 有点误导:)