解决pytest导入Jupyter Notebook模块的ModuleNotFoundError问题
解决Jupyter Notebook导入到pytest的ModuleNotFoundError问题
尝试从同目录的MyNotebook.ipynb导入add函数到test_add.py执行pytest时,出现以下错误:
ImportError while importing test module '/app/test_add.py'. Hint: make sure your test modules/packages have valid Python names. Traceback: /usr/local/lib/python3.11/importlib/__init__.py:126: in import_module return _bootstrap._gcd_import(name[level:], package, level) test_add.py:1: in <module> from MyNotebook import add ModuleNotFoundError: No module named 'MyNotebook'
原因是Python默认不支持直接将.ipynb格式文件当作可导入模块,必须先做格式转换或用特殊方式加载。以下是三种可行解决方案:
方法1:用nbconvert转成Python文件(最稳妥)
nbconvert是Jupyter自带工具,可直接把Notebook转成标准.py文件:
- 执行命令:
jupyter nbconvert --to script MyNotebook.ipynb
执行后会生成MyNotebook.py,原test_add.py的导入语句无需修改,直接运行pytest即可。
方法2:用import_ipynb库直接导入
如果不想转换文件,可通过第三方库直接加载Notebook:
- 安装依赖库:
pip install import_ipynb
- 修改
test_add.py代码,先导入import_ipynb:
import import_ipynb from MyNotebook import add def test_add(): assert add(2, 3) == 5 assert add(0, 0) == 0 assert add(-1, 1) == 0
之后运行pytest就能正常导入函数。
方法3:手动解析Notebook(无需额外依赖)
不想安装第三方库的话,可直接读取.ipynb的JSON结构,提取代码执行:
修改test_add.py如下:
import json # 读取Notebook文件内容 with open('MyNotebook.ipynb', 'r', encoding='utf-8') as f: notebook_content = json.load(f) # 遍历所有代码单元格并执行 for cell in notebook_content['cells']: if cell['cell_type'] == 'code': code_block = ''.join(cell['source']) exec(code_block) def test_add(): assert add(2, 3) == 5 assert add(0, 0) == 0 assert add(-1, 1) == 0
这样也能直接使用add函数完成测试。
内容的提问来源于stack exchange,提问作者Bosser445
相关产品推荐
相关产品推荐

