在pywikibot
DAG 文件(或 DAG 文件导入的模块)中导入时,DAG 会损坏,并在 Web 服务器 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
's 日志记录(发送bool
?)。verbose_output = 0
可以通过添加的pywikibot
配置文件 ( )来关闭详细日志记录user-config.py
,但这并不能解决问题。
奇怪的是,运行这个简单的脚本
import pywikibot
import airflow
文件仍然输出user-config.py
来自. 但是,当不导入 Airflow 时,它会在没有任何日志输出的情况下运行。但是,我尝试通过修改库来完全禁用日志记录,即使导入了 Airflow 也会禁用日志记录,但 DAG 仍被 Airflow 视为损坏。verbose_output=0
pywikibot
pywikibot
logging.logoutput()
手动触发 DAG 时,DAG 确实“启动”,但任务从不排队;他们仍然停留在状态None
。