gpt4 book ai didi

Python循环导入,不能在两个文件之间导入函数?

转载 作者:行者123 更新时间:2023-12-04 07:27:18 26 4
gpt4 key购买 nike

我正面临一个循环导入错误的烦人问题,我不明白我做错了什么。这里的代码:
主文件

import uvicorn
import app.config.config as config

app = config.load_config()
CONFIG = config.read_config()

if __name__ == "__main__":
uvicorn.run(app, host=CONFIG["APPLICATION"]["HOST"], port=CONFIG["APPLICATION"]["PORT"])
配置文件
import os
import toml
import logging
import app.api.routing as routing
from fastapi import FastAPI

BASE_DIR = os.getcwd()


def read_config():
try:
CONFIG = toml.load(BASE_DIR + "/config.toml")
return CONFIG
except FileNotFoundError as err:
logging.error(f"Unable to read configuration file: {err}")
return None


def load_config():
app = FastAPI()
app.include_router(routing.router)
return app
数据库.py
from sqlalchemy import create_engine
from sqlalchemy.orm import declarative_base, sessionmaker
import app.config.config as config

CONFIG = config.read_config()

USERNAME = CONFIG["POSTGRES"]["USERNAME"]
PASSWORD = CONFIG["POSTGRES"]["PASSWORD"]
HOSTNAME = CONFIG["POSTGRES"]["HOSTNAME"]
DATABASE = CONFIG["POSTGRES"]["DATABASE"]
PORT = CONFIG["POSTGRES"]["PORT"]

SQLALCHEMY_DATABASE_URI = f"postgresql://{USERNAME}:{PASSWORD}@{HOSTNAME}:{PORT}/{DATABASE}"
engine = create_engine(SQLALCHEMY_DATABASE_URI)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
Base = declarative_base()


def get_db():
db = SessionLocal()
try:
yield db
finally:
db.close()
错误:
CONFIG = config.read_config()
AttributeError: partially initialized module 'app.config.config' has no attribute 'read_config' (most likely due to a circular import)
我正在使用带有 Python 3.9 的 FastAPI 框架。
在代码中,我已经导入了 2 次“app.config.config”(main.py 和 database.py),我需要导入这个配置文件才能使用函数 read_config()包含在其中。
任何人都可以帮忙吗?谢谢
项目结构:
.
├── app
│   ├── api
│   │   ├── __init__.py
│   │   └── routing.py
│   ├── config
│   │   ├── config.py
│   │   ├── __init__.py
│   │   └── settings.py
│   ├── database
│   │   ├── database.py
│   │   └── __init__.py
│   ├── __init__.py
│   ├── main.py
│   ├── models
│   │   ├── __init__.py
│   │   └── placesModel.py
│   └── service
│   ├── crud.py
│   ├── __init__.py

最佳答案

我怀疑 app.api.routing尝试导入database .

  • 首先尝试重构您的代码并拆分 routing所以它不需要database
  • 否则,调用read_configdatabase及时。有各种不同的解决方案来调用 read_config .

  • def _get_session_local():
    NFIG = config.read_config()
    ...
    return sessionmaker(autocommit=False, autoflush=False, bind=engine)


    def get_db():
    if get_db._get_session_local is None:
    get_db._session_local = _get_session_local()
    try:
    yield get_db._session_local()
    finally:
    db.close()
    get_db._session_local = None
    更一般地,要避免在导入期间执行代码。

    关于Python循环导入,不能在两个文件之间导入函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68145410/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com