You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

  1. 修正导入语法:导入ipynb文件不需要加.ipynb后缀,在import_ipynb行添加注释直接忽略F401检查,比全局配置更适配CI环境:
import import_ipynb  # noqa: F401
from ontology_tagger.notebooks.ontology_tagger import main
  1. 确保ontology_tagger/notebooks目录下存在空的__init__.py文件,Python才能识别该目录为可导入的包。
  2. 修正testing.py中的调用错误:直接调用导入的main(),无需加前缀:
with self.assertLogs() as captured:
    main()
    # 后续逻辑不变

方案2:CI场景更稳定的无依赖方案

提前将ipynb文件转换为标准py文件再导入,完全避免ipynb导入和lint问题:

  1. 在测试执行前添加转换命令:
jupyter nbconvert --to script ontology_tagger/notebooks/ontology_tagger.ipynb
  1. 直接用普通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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 15:15:03