Azure DevOps流水线flake8忽略规则失效且导入ipynb文件报错如何解决
核心需求
将MyCode.ipynb(ontology_tagger.ipynb)笔记本导入到testing.py中调用指定函数,验证ipynb文件中的日志输出功能。
错误现象
初始导入语句:
from ontology_tagger.notebooks.ontology_tagger import main
抛出错误:
ModuleNotFoundError: No module named 'ontology_tagger.notebooks.ontology_tagger'
已尝试方案
- 安装
import_ipynb依赖:
pip install import_ipynb
- 调整导入代码:
import import_ipynb from ontology_tagger.notebooks.ontology_tagger.ipynb import main
执行后遇到flake8 Lint错误:
#17 2.530 /home/worker/python/ontology_tagger/ontology_tagger/tests/test_ontology_tagger.py:19:1: F401 'import_ipynb' imported but unused
执行忽略规则命令flake8 --per-file-ignores="test_ontology_tagger.py:F401"后问题未解决。
解决方案
方案1:继续使用import_ipynb
- 修正导入语法:导入ipynb文件不需要加
.ipynb后缀,在import_ipynb行添加注释直接忽略F401检查,比全局配置更适配CI环境:
import import_ipynb # noqa: F401 from ontology_tagger.notebooks.ontology_tagger import main
- 确保
ontology_tagger/notebooks目录下存在空的__init__.py文件,Python才能识别该目录为可导入的包。 - 修正
testing.py中的调用错误:直接调用导入的main(),无需加前缀:
with self.assertLogs() as captured: main() # 后续逻辑不变
方案2:CI场景更稳定的无依赖方案
提前将ipynb文件转换为标准py文件再导入,完全避免ipynb导入和lint问题:
- 在测试执行前添加转换命令:
jupyter nbconvert --to script ontology_tagger/notebooks/ontology_tagger.ipynb
- 直接用普通Python语法导入即可:
from ontology_tagger.notebooks.ontology_tagger import main
该方案不需要额外安装import_ipynb,也不会产生lint错误,更适合Azure DevOps这类CI/CD流水线场景。
调整后完整testing.py代码
import unittest from unittest import TestCase import sys import logging import import_ipynb # noqa: F401 from ontology_tagger.notebooks.ontology_tagger import main class TestExample(TestCase): def test_logging(self): with self.assertLogs() as captured: main() print('captured.records: ', captured.records) print('list(captured.records): ', list(captured.records)) self.assertTrue(len(captured.records) > 2) self.assertTrue("Started" in captured.records[0].getMessage()) success_log_msgs = ['self.tokenizer.model_max_length >= DEFAULT_MODEL_MAX_LEN:', 'self._num_classes:'] for slm in success_log_msgs: self.assertTrue(any(True for log in list(captured.records) if slm in log)) self.assertTrue(len(captured.records) > len(success_log_msgs)) if __name__ == '__main__': unittest.main()
内容的提问来源于stack exchange,提问作者StressedBoi69420
相关产品推荐
相关产品推荐

