ImportError-尝试相对导入,没有已知的父包

jge*_*ngo 9 python docker

看来这是一个已知的问题,我不是唯一遇到此问题的人。但是我读过的StackOverflow主题都没有帮助我。

所以这是我文件夹的树:

.
??? Dockerfile
??? app
?   ??? __init__.py
?   ??? app.py
?   ??? config.py
?   ??? controllers
?   ?   ??? home.py
?   ??? models.py
?   ??? views
?       ??? home.py
??? database.conf
??? docker-compose.yml
??? jarvis.conf
??? requirements.txt
Run Code Online (Sandbox Code Playgroud)

如您所见,我已经尝试对我的应用程序进行了docker化。

让我们看看我的Dockerfile和docker-compose.yml

Dockerfile:

FROM python:3.6.8-alpine

LABEL maintainer="Jordane * <*>"
LABEL version="1.0.0"

RUN apk add build-base postgresql-dev

RUN pip install --upgrade pip
COPY requirements.txt /
RUN pip install -r requirements.txt

COPY app/ /app
WORKDIR /app

CMD ["gunicorn", "-w 1", "app:app", "-b", "0.0.0.0:3000"]
Run Code Online (Sandbox Code Playgroud)

docker-compose.yml:

version: '3.5'

services:

  db:
    container_name: postgres
    image: postgres:11.2-alpine
    env_file: database.conf
    ports:
      - 5432:5432
    volumes:
      - dbdata:/var/lib/postgresql/data

  web:
    build: .
    container_name: flask
    restart: always
    env_file: 
      - jarvis.conf
      - database.conf
    environment:
      - PYTHONDONTWRITEBYTECODE=1
    ports:
      - 6876:3000
    volumes:
      - ./app/:/app
    depends_on:
      - db

volumes:
  dbdata:
Run Code Online (Sandbox Code Playgroud)

我认为这是我麻烦的开始

我已经写了这个__init__.py:

from flask import Flask
import flask_sqlalchemy

from .models import db
from . import config

def create_app():
    flask_app = Flask(__name__)
    flask_app.config['SQLALCHEMY_DATABASE_URI']= config.DB_CONN_URI
    flask_app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
    flask_app.app_context().push()
    db.init_app(flask_app)
    db.create_all()
    return flask_app
Run Code Online (Sandbox Code Playgroud)

如您在上面的Dockerfile中看到的,我正在用gunicorn运行我的应用程序并运行该应用程序。

app.py:

""" Jarvis slackBot v1.0 (api) """

__author__ = "titus"

from flask import request, jsonify

from . import create_app
from .models import User, db

from views.home import home_bp

from loguru import logger

app = create_app()
# logger.add("app.log", rotation="500 MB")

app.register_blueprint(home_bp, url_prefix='/home')
Run Code Online (Sandbox Code Playgroud)

这是错误:

flask  |     from . import create_app
flask  | ImportError: attempted relative import with no known parent package
Run Code Online (Sandbox Code Playgroud)

我已遵循此教程来帮助我:https : //medium.com/@hmajid2301/implementing-sqlalchemy-with-docker-cb223a8296de

所以它应该可以工作...

如果我更换:

  • from . import create_app 通过 from __init__ import create_app
  • from .models import User, db 通过 from models import User, db
  • from .models import db 通过 from models import db
  • from . import config 通过 import config

它的效果更好,但我确实感觉自己做错了。

每个建议或帮助将不胜感激。

谢谢

小智 3

此错误是由于当前版本的gunicorn (19.9.0) 用于__import__(your_app)加载您的应用程序,该应用程序显然没有导入父包。这意味着您的__init__.py永远不会被调用。
(参见https://github.com/benoitc/gunicorn/blob/19.x/gunicorn/util.py#L350

这似乎在当前的gunicorn repo 版本中得到了修复,我认为它将与20.0.0 一起发布。
(参见https://github.com/benoitc/gunicorn/blob/master/gunicorn/util.py#L331

最简单的解决方法是使用:并将其添加到__init__.py
CMD ["gunicorn", "-w 1", "app", "-b", "0.0.0.0:3000"]
(底部):
from .app import app

或者甚至更好,放入create_app一个单独的文件,并且仅在__init__.py中导入。只要确保create_app之前已导入即可app