FastAPI 说缺少文件夹名称作为模块
FastAPI says missing folder name as module
我在 pycharm 中有一个与 uvicorn 的 FastAPI 相关的问题。我的项目具有以下结构:
LearningPy <folder name>
|
|-- apis <folder name>
-----|--modelservice <folder name>
---------|--dataprovider.py
---------|--main.py
---------|--persondetails.py
-----|--config.py
首先我使用以下路径:D:\Learnings\apis 和 运行 以下代码:uvicorn main:app --reload
然后它给出了错误:
Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)
Started reloader process [23445]
Error loading ASGI app. Could not import module "apis".
但是,在阅读了 的建议后,我将路径更改为 D:\Learnings\apis\modeservice 以上错误消失了,但现在它开始了抛出一个不同的错误:
ModuleNotFoundError: 没有名为 'apis'
的模块
这是我的 main.py 和 config.py 代码文件:
main.py--
import uvicorn
from fastapi import FastAPI
from starlette.middleware.cors import CORSMiddleware
from datetime import datetime
from apis import config
from apis.modelservice import dataprovider
app = FastAPI(debug=True)
def get_application() -> FastAPI:
application = FastAPI(title="PersonProfile", description="Learning Python CRUD",version="0.1.0")
origins = [
config.API_CONFIG["origin_local_ip"],
config.API_CONFIG["origin_local_url"]
]
application.add_middleware(
CORSMiddleware,
allow_origins=origins,
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
#application.include_router(processA.router)
return application
app = get_application()
@app.get("/")
def read_root():
return {"main": "API Server " + datetime.now().strftime("%Y%m%d %H:%M:%S")}
@app.get("/dbcheck")
def read_root():
try:
dataprovider.get_db().get_collection("Person")
except Exception as e:
return {"failed":e}
else:
return { "connected":True}
if __name__ == "__main__":
uvicorn.run(app, host="0.0.0.0", port=8000, reload=True)
这里是config.py--
API_CONFIG = {
"origin_local_ip": "http://127.0.0.1:3000",
"origin_local_url": "http://localhost:3000"
}
本项目基于 React+Mongo+python(用于连接 mongodb 的 pymongo)构建。
提前致谢。
你的应用程序中的问题是你的模块组织,首先我尝试了你的文件夹结构我得到了和你一样的错误,我调试了一下,我发现错误是在导入配置时所以我更深入地研究了理解为什么 Python 无法导入您的配置,
我在顶级文件夹中创建了一个脚本来找出原因。还在 config.py
和 modelservice.main.py
的打印行中添加
print('__file__={0:<35} | __name__={1:<20} | __package__={2<20}'.format(__file__,__name__,str(__package__)))
import apis.config
import apis.modelservice.main
这是结构
apis
├── config.py
└── modelservice
└── main.py
我 运行 名为 main.py 的顶级文件夹脚本中的脚本,结果如下:
__file__=main.py | __name__=__main__ | __package__=None
__file__=/home/yagiz/Desktop/test/apis/config.py | __name__=apis.config | package__=apis
apis.config
__file__=/home/yagiz/Desktop/test/apis/modelservice/main.py | __name__=apis.modelservice.main | __package__=apis.modelservice
感觉很奇怪,因为我应该可以相对导入,但是当我尝试导入那个东西时
from .. import config
它返回:
File "./main.py", line 8, in <module>
from .. import config
ImportError: attempted relative import with no known parent package
只是为了测试,我尝试了这个结构,我也使用了 absolute import import config:
apis/
├── modelservice
├── config.py
├── main.py
INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO: Started reloader process [14155] using statreload
__file__=./main.py | __name__=main | __package__=
__file__=./config.py | __name__=config | __package__= config
INFO: Started server process [14157]
INFO: Waiting for application startup.
INFO: Application startup complete.
一切都像这样工作得很好,所以问题出在你的模块组织以及你如何导入东西,所以再看看它们。
添加到 Yagizcan 上面的回答,如果有人仍然在 pycharm 中遇到模块导入错误,请从文件菜单将源根目录更改为代码文件夹。
LearningPy <folder name>
|
|-- apis <folder name>
-----|--modelservice <folder name>
---------|--dataprovider.py
---------|--persondetails.py
------|--main.py
------|--config.py
这里我将 main.py 移到了 modelservice 文件夹之外。因为 main.py 将 运行ning 为 api。然后,我在 运行 代码中添加了以下代码
uvicorn path to apisfolder.main:app --reload
。现在 运行 没有任何问题。
我在 pycharm 中有一个与 uvicorn 的 FastAPI 相关的问题。我的项目具有以下结构:
LearningPy <folder name>
|
|-- apis <folder name>
-----|--modelservice <folder name>
---------|--dataprovider.py
---------|--main.py
---------|--persondetails.py
-----|--config.py
首先我使用以下路径:D:\Learnings\apis 和 运行 以下代码:uvicorn main:app --reload 然后它给出了错误:
Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)
Started reloader process [23445]
Error loading ASGI app. Could not import module "apis".
但是,在阅读了
这是我的 main.py 和 config.py 代码文件:
main.py--
import uvicorn
from fastapi import FastAPI
from starlette.middleware.cors import CORSMiddleware
from datetime import datetime
from apis import config
from apis.modelservice import dataprovider
app = FastAPI(debug=True)
def get_application() -> FastAPI:
application = FastAPI(title="PersonProfile", description="Learning Python CRUD",version="0.1.0")
origins = [
config.API_CONFIG["origin_local_ip"],
config.API_CONFIG["origin_local_url"]
]
application.add_middleware(
CORSMiddleware,
allow_origins=origins,
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
#application.include_router(processA.router)
return application
app = get_application()
@app.get("/")
def read_root():
return {"main": "API Server " + datetime.now().strftime("%Y%m%d %H:%M:%S")}
@app.get("/dbcheck")
def read_root():
try:
dataprovider.get_db().get_collection("Person")
except Exception as e:
return {"failed":e}
else:
return { "connected":True}
if __name__ == "__main__":
uvicorn.run(app, host="0.0.0.0", port=8000, reload=True)
这里是config.py--
API_CONFIG = {
"origin_local_ip": "http://127.0.0.1:3000",
"origin_local_url": "http://localhost:3000"
}
本项目基于 React+Mongo+python(用于连接 mongodb 的 pymongo)构建。
提前致谢。
你的应用程序中的问题是你的模块组织,首先我尝试了你的文件夹结构我得到了和你一样的错误,我调试了一下,我发现错误是在导入配置时所以我更深入地研究了理解为什么 Python 无法导入您的配置,
我在顶级文件夹中创建了一个脚本来找出原因。还在 config.py
和 modelservice.main.py
print('__file__={0:<35} | __name__={1:<20} | __package__={2<20}'.format(__file__,__name__,str(__package__)))
import apis.config
import apis.modelservice.main
这是结构
apis
├── config.py
└── modelservice
└── main.py
我 运行 名为 main.py 的顶级文件夹脚本中的脚本,结果如下:
__file__=main.py | __name__=__main__ | __package__=None
__file__=/home/yagiz/Desktop/test/apis/config.py | __name__=apis.config | package__=apis
apis.config
__file__=/home/yagiz/Desktop/test/apis/modelservice/main.py | __name__=apis.modelservice.main | __package__=apis.modelservice
感觉很奇怪,因为我应该可以相对导入,但是当我尝试导入那个东西时
from .. import config
它返回:
File "./main.py", line 8, in <module>
from .. import config
ImportError: attempted relative import with no known parent package
只是为了测试,我尝试了这个结构,我也使用了 absolute import import config:
apis/
├── modelservice
├── config.py
├── main.py
INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO: Started reloader process [14155] using statreload
__file__=./main.py | __name__=main | __package__=
__file__=./config.py | __name__=config | __package__= config
INFO: Started server process [14157]
INFO: Waiting for application startup.
INFO: Application startup complete.
一切都像这样工作得很好,所以问题出在你的模块组织以及你如何导入东西,所以再看看它们。
添加到 Yagizcan 上面的回答,如果有人仍然在 pycharm 中遇到模块导入错误,请从文件菜单将源根目录更改为代码文件夹。
LearningPy <folder name>
|
|-- apis <folder name>
-----|--modelservice <folder name>
---------|--dataprovider.py
---------|--persondetails.py
------|--main.py
------|--config.py
这里我将 main.py 移到了 modelservice 文件夹之外。因为 main.py 将 运行ning 为 api。然后,我在 运行 代码中添加了以下代码
uvicorn path to apisfolder.main:app --reload
。现在 运行 没有任何问题。