Python 如何使用Pywikibot的气流
在DAG文件(或DAG文件导入的模块)中导入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
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('
时,它会变成详细模式,我不明白为什么。。。