Python气流-从PythonOperator返回结果

Python气流-从PythonOperator返回结果,python,airflow,Python,Airflow,我已经写了一个有多个PythonOperators的DAG task1 = af_op.PythonOperator(task_id='Data_Extraction_Environment', provide_context=True, python_callable=Task1, dag=dag1) def Task1(**kwargs): return(kwargs['dag_

我已经写了一个有多个PythonOperators的DAG

task1 = af_op.PythonOperator(task_id='Data_Extraction_Environment',
                          provide_context=True,
                          python_callable=Task1, dag=dag1)

def Task1(**kwargs):
    return(kwargs['dag_run'].conf.get('file'))
从PythonOperator调用“Task1”方法。该方法正在返回一个值,该值需要传递给下一个PythonOperator。如何从“task1”变量获取该值,或者如何获取从task1方法返回的值

更新:

    def Task1(**kwargs):
          file_name = kwargs['dag_run'].conf.get[file]
          task_instance = kwargs['task_instance']
          task_instance.xcom_push(key='file', value=file_name) 
          return file_name

  t1 = PythonOperator(task_id = 'Task1',provide_context=True,python_callable=Task1,dag=dag)

  t2 =   BashOperator(
      task_id='Moving_bucket', 
      bash_command='python /home/raw.py {{ task_instance.xcom_pull(task_ids='Task1',key='file') }} ',
      dag=dag,
    )

t2.set_upstream(t1)

您可能想查看Airflow的XCOM:

如果从函数返回值,则该值存储在xcom中。在您的情况下,您可以从其他Python代码中访问它:

task_instance = kwargs['task_instance']
task_instance.xcom_pull(task_ids='Task1')
或者在这样的模板中:

{{ task_instance.xcom_pull(task_ids='Task1') }}
如果要指定一个密钥,可以将其推入XCOM(位于任务内部):

然后,您可以像这样访问它:

task_instance.xcom_pull(task_ids='my_task', key='the_key')
编辑1


后续问题:如何将该值传递给另一个python操作符,而不是在另一个函数中使用该值,如“t2=”BashOperator(task\u id='Moving\u bucket',bash\u command='python/home/raw.py”%s''%file\u name,dag=dag)”---我想访问“Task1”返回的文件名。这将如何实现

首先,在我看来,这个值实际上并没有传递给另一个
PythonOperator
,而是传递给一个
bash操作符

其次,我在上面的回答中已经提到了这一点。字段
bash\u命令
是模板化的(请参阅源代码中的
template\u字段
)。因此,我们可以使用模板化版本:

BashOperator(
  task_id='Moving_bucket', 
  bash_command='python /home/raw.py {{ task_instance.xcom_pull(task_ids='Task1') }} ',
  dag=dag,
)
编辑2

说明: Airflow的工作原理是这样的:它将执行Task1,然后填充xcom,然后执行下一个任务。因此,对于您的示例,您需要先执行Task1,然后在Task1的下游执行Moving_bucket


由于您使用的是返回函数,您还可以从
xcom\u pull
中省略
key='file'
,而不在函数中手动设置它。

而不是在另一个函数中使用该值。如何将该值传递给另一个PythonOperator,如-“t2=”bash操作符(task_id='Moving_bucket',bash_command='python/home/raw.py“%s”'%file_name,dag=dag)――我想访问由“Task1”返回的文件名。这将如何实现?我在执行此操作时更新了问题,得到的结果是“无”。当我打印文件名时,它正在打印文件名。我是否遗漏了任何内容?是的…是的,我正在以相同的方式执行…我已更新代码起初我没有手动添加…它给出了“无”,然后我添加了,在这两种情况下,值都是“无”是..我检查了..它正在打印日志中的值..我正在从URL执行DAG,如“{%22文件%22:%22data.csv%22}”
BashOperator(
  task_id='Moving_bucket', 
  bash_command='python /home/raw.py {{ task_instance.xcom_pull(task_ids='Task1') }} ',
  dag=dag,
)