簡體   English   中英

導入錯誤 - 在沒有已知父包的情況下嘗試相對導入

[英]ImportError - attempted relative import with no known parent package

這似乎是一個已知問題,我不是唯一遇到此問題的人。 但是我讀過的 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:

我認為這是我麻煩的開始

我寫了這個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 運行我的應用程序並運行該應用程序。

應用程序.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 . import create_app通過from __init__ import create_app
  • from .models import User, db by from models import User, db
  • from .models import db by from models import db
  • from . import config from . import configimport 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 中導入。 只需確保在app之前導入create_app

我對 python 比較陌生,但今天在 cloudcraper 上遇到了這個問題。

最初的代碼是:

from . import __version__ as cloudscraper_version

我使用 pip3 安裝了 cloudcraper,因此它直接安裝到 C:\\Python39\\Lib\\site-packages\\cloudscraper 我在嘗試運行其中一個 py 文件時收到了相同的錯誤消息。

我真的找不到任何比它更令人頭疼的東西(移動、重命名文件等),因為我只是想在 cloudcraper 中運行 help.py。 我有大量的模塊和包,最后把它們都放到了我想要的與我的解釋器交互的地方,所以我不想移動任何東西。 我通過這樣做修復了它:

from cloudscraper import __version__ as cloudscraper_version

*注意,如果您使用“以管理員身份運行”通過 cmd 安裝軟件包,但通過您電腦上的用戶配置文件使用這些文件,您將需要更改權限以訪問您在特定 py 文件上的 PC 用戶配置文件想編輯。 (右鍵文件>屬性>安全>'編輯權限'>完全控制)

只是想分享,以防這可以幫助可能遇到此問題的其他人。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM