【发布时间】:2020-03-25 01:39:37
【问题描述】:
在 DAG 文件(或 DAG 文件导入的模块)中导入 pywikibot 时,DAG 会损坏,并在网络服务器 UI 中引发错误:
Broken DAG: [/path/to/airflow/dags/dag.py] encode() argument 1 must be str, not bool
我试图找到堆栈跟踪,但在airflow/logs 中进行搜索却找不到任何东西。运行airflow list_dags 运行成功,但无助于调试问题(如this question 所建议的那样),即使使用--report。
因此我的问题是:如何在 Airflow DAG 任务中使用 Pywikibot?
我在下面添加了其他信息,以展示我迄今为止所做的尝试。找到答案后,可以删除这个,让问题更简洁。
以下是示例 DAG 的代码:
from airflow import DAG
from airflow.operators.python_operator import PythonOperator
from datetime import timedelta, datetime
#### this part is typically imported from another module ####
# to import, pywikibot requires `user-config.py` file or this env variable
import os
os.environ['PYWIKIBOT_NO_USER_CONFIG'] = '1'
import pywikibot
def do_nothing():
pass
#############################################################
dag = DAG('try_pywikibot', schedule_interval=timedelta(days=1))
default_args = {
'start_date': datetime(2019,1,1),
}
task1 = PythonOperator(
python_callable=do_nothing,
task_id=f'do_nothing',
dag=dag,
default_args=default_args,
)
关于导入pywikibot的注意事项:
Pywikibot 要求在工作目录中有一个配置文件user-config.py,除非将PYWIKIBOT_NO_USER_CONFIG 环境变量指定为0。此类文件的示例:
family = 'wikipedia' # required
mylang = 'en' # required
# verbose_output = 0 # optional
我认为这可能是因为pywikibot 的日志记录(发送bool?)。可以通过在 pywikibot 的配置文件 (user-config.py) 中添加 verbose_output = 0 来关闭详细日志记录,但这并不能解决问题。
奇怪的是,运行这个简单的脚本
import pywikibot
import airflow
使用带有verbose_output=0 的user-config.py 文件仍会从pywikibot 输出详细日志。但是,当不导入 Airflow 时,它会在没有任何日志输出的情况下运行。但是,我尝试通过修改库的 logging.logoutput() 来完全禁用 pywikibot 的日志记录,即使导入了 Airflow 也会禁用日志记录,但 DAG 仍然被 Airflow 视为损坏。
手动触发 DAG 时 DAG 确实“启动”,但任务从不排队;他们仍然停留在状态None。
【问题讨论】:
-
我注意到当我使用
logging.basicConfig('时,它会变成详细模式,我不明白为什么......