1. 问题来源
今天在使用python框架时,遇到一个报错:AttributeError: module ‘asyncio’ has no attribute ‘run’,问题是这样的
用pycharm去运行fastapi——即下面一串代码时,报错了:
from fastapi import FastApi
import uvicorn
app = FastApi()
@app.get('\')
def helloWorld():
return {"FastApi":"Hello FastApi! nice to meet you! "}
if __name__ == '__main__':
uvicorn.run('main:app')
报错:
E:\soft\python3.6.8\install\python.exe E:/soft/python3.6.8/wk/fastApiServerForEncoding/servece01.py
Traceback (most recent call last):
File "E:/soft/python3.6.8/wk/fastApiServerForEncoding/servece01.py", line 10, in <module>
uvicorn.run('servece01:app')
File "E:\soft\python3.6.8\install\lib\site-packages\uvicorn\main.py", line 461, in run
server.run()
File "E:\soft\python3.6.8\install\lib\site-packages\uvicorn\server.py", line 67, in run
return asyncio.run(self.serve(sockets=sockets))
AttributeError: module 'asyncio' has no attribute 'run'
Process finished with exit code 1
2. 定位问题
先到报错的代码,查看代码:
代码如下: asyncio.run(self.serve(sockets=sockets)) 中, 看能找到asiyncio中的run方法不,点击后跳转
class Server:
def __init__(self, config: Config) -> None:
self.config = config
self.server_state = ServerState()
self.started = False
self.should_exit = False
self.force_exit = False
self.last_notified = 0.0
def run(self, sockets: Optional[List[socket.socket]] = None) -> None:
self.config.setup_event_loop()
# 这行是报错代码,看看有没有对应的属性
return asyncio.run(self.serve(sockets=sockets))
跳转后的代码如下:
import sys
# 这个是python的版本号,由于我的python是3.6.8版本的
# sys.version_info=3.6.8 所以造成没有分支可以走,造成run了个空气
if sys.version_info >= (3, 7):
from typing import Awaitable, Optional, TypeVar
_T = TypeVar("_T")
if sys.version_info >= (3, 8):
def run(main: Awaitable[_T], *, debug: Optional[bool] = ...) -> _T: ...
else:
def run(main: Awaitable[_T], *, debug: bool = ...) -> _T: ...
注: sys.version_info能查看python的版本
3. 处理问题
那么就有两个方法,
- 第一种: 降低我的uvicorn的版本,让之能与我的3.6.8的版本能兼容
- 第二种: 安装更高的版本的Python
4. 如何避免这类问题发生
版本不兼容问题,对于python而言,是一个老生常谈的问题了。这个应该是有一个比较好的处理方案,我暂时还没有那水平,到时候我会专门出一期,来谈谈如何避免这类问题的发生。