在DAG文件(或DAG文件导入的模块)中导入pywikibot时,DAG损坏,从而在Web服务器UI中引发错误:

Broken DAG: [/path/to/airflow/dags/dag.py] encode() argument 1 must be str, not bool


我试图找到堆栈跟踪,但是通过在airflow/logs中进行搜索找不到任何东西。运行airflow list_dags成功运行,即使使用--report,也无法帮助调试问题(如this question所建议)。

因此,我的问题是:如何在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 env变量指定为0。此类文件的示例:

family = 'wikipedia' # required
mylang = 'en' # required
# verbose_output = 0  # optional




我以为可能是因为pywikibot的日志记录(发送bool?)。可以通过在verbose_output = 0的配置文件(pywikibot)中添加user-config.py来关闭详细日志记录,但这不能解决问题。

奇怪的是,运行此简单脚本

import pywikibot
import airflow


带有user-config.py且带有verbose_output=0文件的文件仍然从pywikibot输出详细日志。但是,当不导入Airflow时,它将一直运行而没有任何日志输出。但是,我尝试通过修改库的pywikibot来完全禁用logging.logoutput()的日志记录,即使导入了Airflow也会禁用日志记录,但是DAG仍然被认为被Airflow破坏了。



手动触发DAG时,DAG会“启动”,但任务永远不会排队。它们仍停留在状态None中。

最佳答案

将行console_encoding="utf-8"添加到pywikibot的配置user-config.py即可达到目的。



到底为什么,我不确定。当通过Airflow运行时,Pywikibot似乎无法加载console_encodingutf-8的默认值。因为pywikibot的transliterator急切加载,这导致ln的pywikbot.userinterfaces.transliteration.py中出现故障。 1108。

奇怪的是,pywikibot似乎期望一个布尔值,现在抛出

_DifferentTypeError: Configuration variable "console_encoding" is defined as "str" in your user-config.py but expected "bool".


但是,可以安全地忽略这一点。

关于python - 如何在Pywikibot中使用Airflow,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59105092/

10-08 20:29