Python DAG中的外部文件

Python DAG中的外部文件,python,airflow,Python,Airflow,我试图在一个任务中访问外部文件以读取一些sql,结果得到“找不到文件”。有人见过这个吗 from airflow import DAG from airflow.operators.python_operator import PythonOperator from datetime import datetime, timedelta dag = DAG( 'my_dat', start_date=datetime(2017, 1, 1), catchup=False

我试图在一个任务中访问外部文件以读取一些sql,结果得到“找不到文件”。有人见过这个吗

from airflow import DAG
from airflow.operators.python_operator import PythonOperator
from datetime import datetime, timedelta

dag = DAG(
    'my_dat',
    start_date=datetime(2017, 1, 1),
    catchup=False,
    schedule_interval=timedelta(days=1)
)

def run_query():
    # read the query
    query = open('sql/queryfile.sql')
    # run the query
    execute(query)

tas = PythonOperator(
    task_id='run_query', dag=dag, python_callable=run_query)
日志状态如下所示:

IOError: [Errno 2] No such file or directory: 'sql/queryfile.sql'

我知道我可以简单地将查询复制并粘贴到同一个文件中,这并不是一个好的解决方案。有多个查询,而且文本非常大,将其嵌入Python代码会影响可读性

所有相关路径均参考气流_HOME环境变量。尝试:

  • 给出绝对路径
  • 将文件放置在相对于主视图的位置
  • 尝试将PWD记录在python可调用文件中,然后决定给出什么路径(最佳选项)

    • 下面是一个示例,使用变量可以简化操作

      • 首先在
        气流UI
        ->
        管理
        ->
        变量中添加变量,例如
        {key:'sql\u path',value:'your\u sql\u script\u folder'}

      • 然后在DAG中添加以下代码,以使用刚添加的气流变量

      DAG代码:

      导入气流
      从airflow.models导入变量
      tmpl\u search\u path=Variable.get(“sql\u path”)
      dag=气流。dag(
      “教程”,
      计划时间间隔=“每日”,
      template_searchpath=tmpl_search_path,#这个
      默认参数=默认参数
      )
      
      • 现在,您可以在文件夹变量下使用sql脚本名称或路径

      • 你可以从中了解更多


      假设
      sql
      目录与当前Python文件相关,您可以像下面这样计算sql文件的绝对路径:

      import os
      
      CUR_DIR = os.path.abspath(os.path.dirname(__file__))
      
      def run_query():
          # read the query
          query = open(f"{CUR_DIR}/sql/queryfile.sql")
          # run the query
          execute(query)
      

      好的评论,但不幸的是,AIRFLOW_HOME是一个可选的环境变量-如果没有它,AIRFLOW就可以正常工作-您不能保证它会被设置。请提供一个完整的示例。定义
      template\u searchpath
      ,这会改变整个脚本行为,我现在可以通过文件名引用该文件吗?例如,这将完成您的示例:```使用open(query\u file\u name,'r')作为file:query\u content=file.read()````我认为这不适用于OP使用的示例DAG和Python的本机
      open()
      。PythonOperator运行在一个pod中,该pod与解析DAG的进程无权访问同一组位置。@RicardoMS嗨,当您想定义自己的
      aiffort.models.Variable
      时,最简单的方法是通过aiffort UI,
      主页->管理->变量来创建新变量,例如:
      {'Key':'RicardoMS_variable','Val':'/opt/specific/path'}
      完成后,可以使用示例代码通过
      tmpl\u search\u path=variable.get(“RicardoMS_variable”)
      加载变量,而不是直接使用
      '/opt/specific/path'