Python 如何使用Pywikibot的气流

Python 如何使用Pywikibot的气流,python,airflow,pywikibot,Python,Airflow,Pywikibot,在DAG文件(或DAG文件导入的模块)中导入pywikibot时,DAG会断开,并在Web服务器UI中引发错误: Broken DAG: [/path/to/airflow/dags/dag.py] encode() argument 1 must be str, not bool 我试图找到堆栈跟踪,但在气流/logs中进行搜索,却找不到任何东西。运行气流列表\u dags会成功运行,即使使用--report,也无助于调试问题(按照的建议) 因此,我的问题是:如何在气流DAG任务中使用Pyw

在DAG文件(或DAG文件导入的模块)中导入
pywikibot
时,DAG会断开,并在Web服务器UI中引发错误:

Broken DAG: [/path/to/airflow/dags/dag.py] encode() argument 1 must be str, not bool
我试图找到堆栈跟踪,但在
气流/logs
中进行搜索,却找不到任何东西。运行
气流列表\u dags
会成功运行,即使使用
--report
,也无助于调试问题(按照的建议)

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

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

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

奇怪的是,运行这个简单的脚本

import pywikibot
import airflow
如果
user config.py
文件的
verbose\u output=0
仍然从
pywikibot
输出详细日志。但是,当不导入气流时,它将在没有任何记录输出的情况下运行。但是,我已经尝试通过修改库的
logging.logoutput()
,从
pywikibot
完全禁用日志记录,即使导入了气流,也会禁用日志记录,但DAG仍然被气流破坏



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

将行
console\u encoding=“utf-8”
添加到pywikibot的配置中,
user config.py
,就达到了目的


确切地说,我不确定。在气流中运行时,Pywikibot似乎无法加载
控制台编码的默认值
utf-8
。由于pywikibot的
音译器
已被急切加载,这将导致ln处的
pywikbot.userinterfaces.translation.py
出现故障。1108

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

_DifferentTypeError: Configuration variable "console_encoding" is defined as "str" in your user-config.py but expected "bool".
但是,可以安全地忽略这一点。

或者:

  • 框架的
    config2.py
    已经更改,这是永远不应该做的

  • Pywikibot可能已经过时了<代码>控制台编码
  • 默认为
    sys.stdout.encoding
    ,应为
    'utf-8'


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

    我也有类似的问题,谷歌把我带到了这里。 这个解决方案并不能解决你的问题,看起来你的解决方式不同。但是,这可能有助于其他人:

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

    导入日志
    导入pywikibot
    输出('这将初始化记录器')
    logger=logging.getLogger('pywiki')
    logger.setLevel(logging.WARNING)
    
    这是一个解决办法,直到它被修复


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

    我注意到,当我使用
    logging.basicConfig('
    时,它会变成详细模式,我不明白为什么。。。