如何在不破坏现有DVC运行逻辑的前提下测试script1.py中的函数?
解决Jupyter Notebook导入src模块时的依赖问题
以下几种方法可以在不破坏原有命令行运行方式的前提下,解决Notebook中导入script1.py时找不到files模块的问题:
方法1:在script1.py中添加条件式路径处理
修改src/script1.py的开头部分,仅当脚本被作为模块导入时(而非直接运行),将src目录添加到Python的搜索路径:
import sys from pathlib import Path # 仅在被导入时执行路径添加,不影响直接运行脚本的场景 if __name__ != "__main__": src_directory = Path(__file__).parent sys.path.append(str(src_directory)) # 原有导入语句保持不变 import files # 后续的函数逻辑...
当你用python src/script1.py命令行运行时,__name__等于__main__,不会执行路径添加,原有逻辑不受影响;而在Notebook中导入script1时,会自动把src目录加入搜索路径,import files就能找到同目录的模块。
方法2:在Notebook中预先配置路径
不需要修改任何脚本,直接在Notebook的单元格中先将src目录添加到Python路径,再导入模块:
import sys from pathlib import Path # 获取项目根目录下的src路径 src_path = Path.cwd() / "src" sys.path.append(str(src_path)) # 现在可以正常导入 from src import script1
这种方法更灵活,不需要改动现有代码,仅在Notebook环境中做临时配置。
方法3:将src目录标记为Python包(轻量方案)
在src目录下创建一个空的__init__.py文件,将其变成Python包结构:
. |--src |----__init__.py |----files.py |----script1.py |----script2.py |-notebook.ipynb
然后在Notebook中添加项目根目录到路径,再导入目标模块:
import sys from pathlib import Path sys.path.append(str(Path.cwd())) # 直接导入script1中的函数 from src.script1 import your_target_function
这种方法不影响原有命令行运行(python src/script1.py依然正常工作),同时让模块结构更规范。
内容的提问来源于stack exchange,提问作者Anton Troitsky
相关产品推荐
相关产品推荐

