python - 导入错误 - 在没有已知父包的情况下尝试相对导入

标签 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
如您所见,我已尝试对我的应用程序进行 dockerized。
让我们看看我的 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"]
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:
我认为这是我麻烦的开始
我写过这个 初始化 .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
正如你在我上面看到的 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')
这是错误:
flask  |     from . import create_app
flask  | ImportError: attempted relative import with no known parent package
我已经按照本教程来帮助我: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

  • 它工作得更好,但我真的觉得我做错了什么。

    最佳答案

    此错误是由于当前版本的 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)

    最简单的解决方法是使用:CMD ["gunicorn", "-w 1", "app", "-b", "0.0.0.0:3000"]并将其添加到(底部)您的 __init__.py :from .app import app
    或者甚至更好,放置 create_app在一个单独的文件中,并且只有在您的 中导入__init__.py .只要确保 create_app之前导入 app .

    关于python - 导入错误 - 在没有已知父包的情况下尝试相对导入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55041141/

    相关文章:

    docker - 不带systemd的CentOS 7 Docker镜像中的服务

    mysql - mariadb启动后如何在docker容器中运行查询?

    python - 解析 WKT 文件

    python - `setData` 方法怎么会失败?

    python - 检查字符串中的空格(python)

    docker - "debconf: delaying package configuration, since apt-utils is not installed":> google notebooks bash error

    docker - 在 Docker 中以 headful 模式执行 puppeteer 的问题

    docker-compose 日志记录不适用于 syslog 选项

    python - 如何在同一个 docker-compose 中连接到远程 Selenium 驱动程序?

    python - 将文本添加到 matplotlib 绘图时自动调整绘图限制