2

pywikibotDAG 文件(或 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=0pywikibotpywikibotlogging.logoutput()


手动触发 DAG 时,DAG 确实“启动”,但任务从不排队;他们仍然停留在状态None

4

3 回答 3

1

将这一行添加console_encoding="utf-8"到 pywikibot 的配置中user-config.py,就可以了。


为什么,我不确定。当通过 Airflow 运行时,Pywikibot 似乎无法加载它的默认值console_encoding, utf-8。因为 pywikibottransliterator是急切加载的,这会导致pywikbot.userinterfaces.transliteration.pyln 失败。1108.

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

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

但是,可以放心地忽略这一点。

于 2019-12-02T15:05:50.337 回答
0

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

https://phabricator.wikimedia.org/T272088

解决方法是初始化记录器并更改 pywiki 的 logLevel:

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

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

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

于 2021-03-06T17:32:17.920 回答
0

任何一个:

  1. 框架config2.py已经改变,永远不应该这样做。

  2. Pywikibot 可能已经过时了。console_encoding默认情况sys.stdout.encoding下应该是'utf-8'.

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

于 2021-01-12T17:46:06.697 回答