从外部manage.py启动create_app工厂模式Flask项目的导入报错问题
问题根因
该问题本质是Python模块搜索路径的匹配差异,和运行环境的默认配置有关:
- PyCharm运行项目时会自动将你标记为「源根(Sources Root)」的目录加入Python的模块搜索路径
sys.path,你本地开发时应该是将myapp目录设为了源根,因此所有from myserver开头的绝对导入都能正常识别。 - 直接在命令行执行
python3 manage.py run时,Python只会将manage.py所在的web目录加入sys.path,你加的os.chdir('myapp')只能切换工作目录,不会修改模块搜索路径;加上你导入create_app时用了from myapp.myserver import create_app,Python会将myserver识别为myapp的子模块,此时myapp目录本身不在sys.path里,自然无法解析from myserver开头的导入语句。
解决方案(无需修改现有项目的导入规则)
方案1:修改manage.py,主动注入模块搜索路径
修改后的manage.py代码如下,不用改动其他项目文件即可正常运行:
import os import sys # 计算myapp目录的绝对路径,兼容不同部署环境 BASE_DIR = os.path.dirname(os.path.abspath(__file__)) MYAPP_PATH = os.path.join(BASE_DIR, 'myapp') # 插入到sys.path最前面,优先级最高 sys.path.insert(0, MYAPP_PATH) from flask.cli import FlaskGroup from myserver import create_app app = create_app() cli = FlaskGroup(app) if __name__ == "__main__": cli()
方案2:配置PYTHONPATH环境变量
不用改代码,运行前指定环境变量即可:
- 本地Linux/Mac执行:
export PYTHONPATH=/var/www/html/flask-docker/services/web/myapp && python3 manage.py run - Docker部署时在Dockerfile中添加配置:
ENV PYTHONPATH=/var/www/html/flask-docker/services/web/myapp
方案3:本地开发可安装项目
在myapp目录下新增setup.py配置文件,执行pip install -e .即可将当前项目注册到Python环境,所有导入永久生效,适合本地长期开发使用。
内容的提问来源于stack exchange,提问作者tbarbot
相关产品推荐
相关产品推荐

