Python 气流中带有形态变量的动态Dag

Python 气流中带有形态变量的动态Dag,python,python-3.x,jinja2,airflow,airflow-scheduler,Python,Python 3.x,Jinja2,Airflow,Airflow Scheduler,我试图制作一个dag,它接受一个conf参数,该参数基本上解析文件名,以便在dag的下游使用。所以类似于将something.txt解析为something来处理我在管道中的文件名转换 我得到了aiffort.exceptions.aifflowerexception:Task缺少start_date参数,因此我想知道我是否在正确的轨道上,是否有人有任何建议,因为我无法通过变量硬编码这些变量。我计划执行这个dag的方法是在bash中对其进行for循环,同时将文件名传递给conf参数 from a

我试图制作一个dag,它接受一个conf参数,该参数基本上解析文件名,以便在dag的下游使用。所以类似于将
something.txt
解析为
something
来处理我在管道中的文件名转换

我得到了
aiffort.exceptions.aifflowerexception:Task缺少start_date参数
,因此我想知道我是否在正确的轨道上,是否有人有任何建议,因为我无法通过变量硬编码这些变量。我计划执行这个dag的方法是在bash中对其进行for循环,同时将文件名传递给conf参数

from airflow.operators.bash_operator import BashOperator
from airflow.operators.python_operator import PythonOperator
from airflow.models import DAG
from datetime import datetime
import os

# Basic arguments to pass to Airflow
args = {
    'owner': 'airflow',
    'start_date': datetime.now(),
}

# Create the head dag
dag = DAG(
    dag_id='test_multiparameters', 
    default_args=args,
    schedule_interval=None)

input_dir = '/input/dchen71/dog/'

templated_command1 = """
touch /input/dchen71/dog/{{ dag_run.conf['file_name'] }} 
"""

# Touch data file 
touchy = BashOperator(
    task_id='create_data', 
    bash_command=templated_command1, 
    dag=dag)

def decat(**kwargs):
    # Generator function for dynamic dags
    base_name = os.path.splitext(context['dag_run'].conf['file_name'])[0]

    cat_template = """
    cat {input_dir}/{base_name}.txt{input_dir}/{base_name}.txt> {input_dir}/meow.txt
    """.format(input_dir = input_dir, base_name = base_name)
    return BashOperator(
        task_id = "create_data",
        bash_command = cat_template,
        dag = dag
        )

dacat = PythonOperator(
    task_id="dacat",
    python_callable = decat,
    provides_context = True
    )


touchy >> dacat


您忘记在PythonOperator中设置
dag=dag
。这就是为什么你会得到例外

我不确定您所说的“在bash中for循环it”是什么意思,但要根据一些参数动态生成dag,我将直接在Python脚本中执行for循环。您可能想阅读更多信息


注意,不建议设置“开始日期”:datetime.now()[]。

您忘记在
Python操作符中设置
dag=dag
。这就是为什么你会得到例外

我不确定您所说的“在bash中for循环it”是什么意思,但要根据一些参数动态生成dag,我将直接在Python脚本中执行for循环。您可能想阅读更多信息


注意,不建议设置
'start_date':datetime.now()
[]。

我还有一个PythonOperator,它带有一个python可调用函数,可以创建一个BashOperator,但我得到的是“BashOperator类型的对象不是JSON可序列化的”。你得到这个错误了吗?你是如何修复它的?我还有一个PythonOperator,它带有一个python可调用函数,可以创建一个bash操作符,但是我得到了一个“bash操作符类型的对象不是JSON可序列化的”。你有没有遇到这个错误?你是如何解决的?