这似乎是一个已知问题,我不是唯一遇到此问题的人。但是我读过的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
它的效果更好,但我真的感觉自己做错了。
每条建议或帮助都将不胜感激。
谢谢
答案 0 :(得分: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
。
答案 1 :(得分:1)
我对 python 比较陌生,但今天在使用 cloudcraper 时遇到了这个问题。
最初的代码是:
from cloudscraper import __version__ as cloudscraper_version
我用pip3安装了cloudscraper,所以直接安装到C:\Python39\Lib\site-packages\cloudscraper 我在尝试运行其中一个 py 文件时收到了相同的错误消息。
我真的找不到任何比它更令人头疼的东西(移动、重命名文件等),因为我只是想在 cloudcraper 中运行 help.py。我有大量的模块和包,最后把它们都放到了我想要的与我的解释器交互的地方,所以我不想移动任何东西。我通过这样做修复了它:
{{1}}
*注意,如果您使用“以管理员身份运行”通过 cmd 安装软件包,但通过您电脑上的用户配置文件使用这些文件,您将需要更改权限以访问您在特定电脑上的用户配置文件py 文件要编辑。 (右键文件>属性>安全>'编辑权限'>完全控制)
只是想分享一下,以防这可以帮助可能遇到此问题的其他人。