如何在Pywikibot中使用Airflow

在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的说明: 除非将user-config.py env变量指定为PYWIKIBOT_NO_USER_CONFIG,否则Pywikibot会在工作目录中需要一个配置文件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的{​​{1}}文件的

仍从{{​​1}}输出详细日志。但是,当不导入Airflow时,它将一直运行而没有任何日志输出。但是,我尝试通过修改库的verbose_output=0来完全禁用来自pywikibot的日志记录,即使导入了Airflow也会禁用日志记录,但是DAG仍然被Airflow破坏了。


当手动触发DAG时,DAG会“启动”,但是任务永远不会排队。他们仍然停留在pywikibot状态。

yin3573389 回答:如何在Pywikibot中使用Airflow

将行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".

但是,根据我的经验,这可以安全地忽略。

,

要么:

  1. 框架的 config2.py 已更改,这是本不该更改的。

  2. Pywikibot 可能已经过时了。 console_encoding默认为sys.stdout.encoding,应为'utf-8'

这取决于您的 Python 和 Pywikibot 版本。

,

我遇到了类似的问题,谷歌把我带到了这里。 此解决方案不会解决您的问题,看起来您以不同的方式解决了这个问题。但是,这可能对其他人有所帮助:

https://phabricator.wikimedia.org/T272088

解决方法是初始化记录器并更改pywiki的日志级别:

import logging
import pywikibot
pywikibot.output('This will initialize the logger')
logger = logging.getLogger('pywiki')
logger.setLevel(logging.WARNING)

这是一个解决方法,直到它被修复!

下次只是一个友好的进步,如果你能说明你使用的是哪个 python/pywikibot 版本,它也可以帮助其他人;)

本文链接:https://www.f2er.com/3007432.html

大家都在问