PyBuilder在虚拟环境运行时无法找到src模块的问题求助
我之前也碰到过一模一样的困扰!明明测试目录已经配置正确,PyBuilder也能找到测试文件,但就是死活找不到src里的模块。这种情况大多和PyBuilder的路径配置或测试文件的导入方式有关,咱们一步步排查:
1. 检查源码目录的PyBuilder配置
PyBuilder默认的源码目录是src/main/python,如果你的项目里源码直接放在根目录下的src文件夹(而非嵌套的src/main/python),那必须手动在build.py里指定这个路径:
project.set_property('dir_source_main_python', 'src')
因为PyBuilder只会把配置好的源码目录添加到Python的sys.path中,要是没设置这个属性,测试运行时自然找不到src里的模块——哪怕你肉眼看着目录结构没问题。
2. 确认测试文件的导入方式正确
假设你的src目录下有个模块叫my_service.py,测试文件里应该直接写:
import my_service
而不是:
from src import my_service # 这种写法会报错!
因为PyBuilder已经把src目录加到了Python路径里,src本身就是模块的根路径,不需要在导入语句里额外加前缀。
3. 验证项目结构与配置匹配
确保你的项目结构和配置对应,比如正确的结构应该是这样的:
projectDir/ ├── build.py ├── src/ │ ├── __init__.py # 可选但推荐,尤其是Python版本低于3.3时 │ └── my_service.py └── tests/ ├── __init__.py └── test_my_service.py
如果src里有子模块,记得每个子目录都要加__init__.py(Python 3.3+支持命名空间包,但PyBuilder对传统模块结构的兼容性更好)。
4. 清理缓存重新构建
有时候PyBuilder的target缓存目录会残留旧的配置,导致路径加载异常。试试删除项目根目录下的target文件夹,然后重新运行:
pyb clean run_unit_tests
从头构建能排除很多缓存带来的奇怪问题。
5. 检查测试任务的路径加载逻辑
如果上面的方法都没用,可以在build.py里显式确认源码路径是否被正确添加:
from pybuilder.core import task, depends @task @depends('prepare') def debug_path(project, logger): import sys logger.info("Current sys.path:") for path in sys.path: logger.info(f"- {path}") # 确认是否包含你的src目录
运行pyb debug_path就能看到当前的Python路径,要是没看到src的路径,就说明之前的配置没生效,得再检查build.py里的属性设置。
我当时就是因为漏了设置dir_source_main_python,默认PyBuilder找的是src/main/python,而我的源码直接在src下,改完配置后问题立刻解决了。你可以先从检查这个配置入手,大概率能搞定!
内容的提问来源于stack exchange,提问作者CrizR

