例如,我找不到任何有关如何使用通过“ -c”传递的JSON变量的有效文档。补余工作。
我一直在打印我的python任务** kwargs来查找,但是我仍然无法确定。 Provide_context =真
有人能指出我正确的方向吗?
所以,我想做什么:
var user = await _userManager.FindByEmailAsync ("jon@live.be");
我有一个PythonOperator:
airflow backfill mydag -c '{"override":"yes"}' -s 2018-12-01 -e 2018-12-12
在run_task中,我想访问覆盖变量:
PythonOperator(
task_id = 'task_identifier',
python_callable = 'run_task',
op_kwargs = {
'task_conf': task_config
},
provide_context=True,
dag = this_dag
)
但是我找不到访问此覆盖变量的方法
def run_task(*args, **kwargs):
dag_run = kwargs.get('dag_run')
logging.info(kwargs['dag_run'].conf.get('override'))
编辑:我确实找到了一个配置设置和说明,似乎表明这些参数已经在代码中设置了
[2018-12-17 10:07:24,649] {models.py:1760} ERROR - 'NoneType' object has no attribute 'get'
Traceback (most recent call last):
File "/home/daimonie/.local/lib/python3.6/site-packages/airflow/models.py", line 1659, in _run_raw_task
result = task_copy.execute(context=context)
File "/home/daimonie/.local/lib/python3.6/site-packages/airflow/operators/python_operator.py", line 95, in execute
return_value = self.execute_callable()
File "/home/daimonie/.local/lib/python3.6/site-packages/airflow/operators/python_operator.py", line 100, in execute_callable
return self.python_callable(*self.op_args, **self.op_kwargs)
File "/home/daimonie/airflow/dags/dag_scheduled_queries.py", line 65, in run_query
logging.info(kwargs['dag_run'].conf.get('override'))
将donot_pickle参数设置为False。
答案 0 :(得分:1)
对于任何想知道错误的原因
AttributeError: 'NoneType' object has no attribute 'get
尝试从 conf
的 dag_run
属性检索键/值是因为传递给 conf
的 airflow backfill mydag -c
参数需要配置为:
'{"conf": {"key1": "value", ...}}'
不是
'{"key1": "value", ...}'
然后你可以从上下文中引用它,例如
def do_something(**context):
value = context['dag_run'].conf['key']
...
答案 1 :(得分:0)
您需要做两件事。
kwargs['run_dag'].conf.get('override')
替换为kwargs['dag_run'].conf.get('override')
。 def run_task(*args, **kwargs):
到def run_task(**kwargs):
答案 2 :(得分:0)
您可以使用LiveData
从CLI传递参数,然后在Python可调用函数中将其用作-c '{"key":"value"}'
就您而言,
操作员:
"dag_run.conf["key"]"
可调用函数:
PythonOperator(
task_id = 'task_identifier',
python_callable = 'run_task',
provide_context=True,
dag = this_dag
)
答案 3 :(得分:0)
对于那些和我一样在尝试阅读 ERROR - 'NoneType' object has no attribute 'get'
时一直徘徊在这里寻找解决相同错误 (kwargs['dag_run'].conf.get('something')
) 的人。
默认情况下,调度程序运行 dag 时未设置字典 dag_run.conf
。这就是错误出现的原因。
因此,当您需要不时使用自定义参数手动运行计划的 dag 时,类似这样的操作将起作用:
在可调用函数中:
def run_task(**kwargs):
if kwargs['dag_run'].conf:
my_parameter = kwargs['dag_run'].conf.get('my_parameter', None)
else:
my_parameter = "some_default_value"