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

时间:2019-10-17 00:04:41

标签: python airflow

* 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/目录手动运行py文件时,没有引发任何错误,并且for循环将输出命令,但气流显然在Web服务器中和运行airflow list_dags时会有所不同。运行airflow list_dags时出现错误

    assert isinstance(table, dict)
AssertionError

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

有人知道这里会发生什么吗?也许关于进口的运作方式有什么看法?

* 更新1

更奇怪的是,从导入的python模块调用函数时,手动运行dag文件时一切运行正常,但是airflow list_dags表示...

  

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

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

* 更新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(即使当我将项目文件夹插入sys.path前面时)。除了使packaged dags之外,还有一种方法可以防止气流组合不同dag的所有environsys.path值(因为我在各种bash和python任务脚本中使用$ PROJECT_HOME)?

1 个答案:

答案 0 :(得分:0)

要从其他路径引入特定模块,我使用解决方案here通过指定其他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)

类似问题here