Python 3.6中ModuleNotFoundError: No module named 'tests'问题排查
看起来你遇到的问题主要集中在导入路径错误,还有几个小的代码逻辑问题,我一一给你拆解:
1. 核心问题:找不到tests模块的原因
你的项目结构里,backend和tests是同级的根目录文件夹,但server.py在backend内部。Python默认只会把当前脚本所在的文件夹(也就是backend)加入到模块搜索路径里,所以它找不到同级的tests文件夹。另外你写的导入语句里还多了一个不存在的linear_regression子目录,你的linearregression.py明明直接在tests下面对吧?
2. 修复步骤
第一步:修正导入逻辑,把根目录加入搜索路径
在server.py的最开头添加代码,让Python能找到项目根目录下的tests文件夹,同时修正错误的导入路径:
from flask import Flask import sys import os # 获取项目根目录(backend文件夹的父目录) root_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) sys.path.append(root_dir) app = Flask(__name__) # 注意:你的linearregression.py直接在tests下,没有linear_regression子目录 from tests.linearregression import predict
第二步:修复变量与函数重名的问题
你在server.py里定义了def predicted_value():,但之前已经有一个同名变量predicted_value = returned_values[3]——这会导致后续调用函数的时候直接拿到变量值,而不是函数。把函数名改个不一样的,比如:
# 把原函数名predicted_value改成get_predicted_value def get_predicted_value(): return predicted_value
然后在路由里对应修改调用:
predicted_val = get_predicted_value()
第三步:修复字符串拼接的错误
你的路由返回里犯了个小错误:直接用了函数名(比如price)而没有调用它(price()),这样返回的是函数对象的字符串,不是你要的数值。另外用f-string来拼接HTML会更清晰不易错:
@app.route('/') def hello_world(): price_val = price() gradient_val = gradient() intercept_val = intercept() predicted_val = get_predicted_value() return (f"<h1>Price is: </h1><p>{price_val}</p><br>" f"<h1>Gradient is: </h1><p>{gradient_val}</p><br>" f"<h1>Intercept is: </h1><p>{intercept_val}</p><br>" f"<h1>Predicted value is: </h1><p>{predicted_val}</p>")
第四步:确认__init__.py的有效性
你已经在backend和tests文件夹里都放了__init__.py,这很好,Python会把它们识别为可导入的包,这部分不用改。
3. 额外建议
如果你的项目是一个标准的Python包结构,也可以考虑用相对导入或者把项目根目录设为Python的环境变量PYTHONPATH,不过上面的方法已经能快速解决你的问题了。
内容的提问来源于stack exchange,提问作者Jananath Banuka

