导入错误 - 尝试相对导入但没有已知的父包。

10

看起来这是一个已知的问题,我并不是唯一遇到这个问题的人。但是我读过的所有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

正如您所看到的,我已经尝试将我的应用程序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"]

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:

我想这是我的麻烦之始

我写了这个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

正如您在我的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

它能够更好地工作,但我真的觉得我在做一些错误的事情。


1
@napuzba:那个链接并没有回答楼主的问题。 - John Jiang
2
OP的问题是什么? :-) - napuzba
2个回答

3
这个错误是由于当前版本的gunicorn(19.9.0)使用__import__(your_app)来加载您的应用程序,而这显然不会导入父包。 这意味着您的 __init__.py从未被调用。
(请参见https://github.com/benoitc/gunicorn/blob/19.x/gunicorn/util.py#L350
看起来在当前的gunicorn仓库版本中已经修复了这个问题,我认为它将随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

2

我是一个相对新手的Python程序员,今天在使用cloudscraper时遇到了这个问题。

原本的代码如下:

from . import __version__ as cloudscraper_version

我使用pip3安装了cloudscraper,因此它直接安装到了C:\Python39\Lib\site-packages\cloudscraper。当我尝试运行其中一个py文件时,我收到了相同的错误消息。
我无法找到任何不值得头疼的东西(移动,重命名文件等),因为我只想运行cloudscraper中的help.py。我有很多模块和包,最终让它们都像我想要的那样与我的解释器交互,所以我不想移动任何东西。我通过这样做来修复它:
from cloudscraper import __version__ as cloudscraper_version

*注意,如果您使用“以管理员身份运行”通过cmd安装软件包,但是通过计算机上的用户配置文件使用文件,则需要更改权限以让特定的py文件允许访问您的计算机用户配置文件。 (右键单击文件>属性>安全>“编辑权限”>完全控制)。
只是想分享一下,以防这可能有助于其他遇到此问题的人。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接