AttributeError: module 'asyncio' has no attribute 'run'

412 阅读1分钟

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. 定位问题

先到报错的代码,查看代码:

image-20220915234919167.png 代码如下: 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而言,是一个老生常谈的问题了。这个应该是有一个比较好的处理方案,我暂时还没有那水平,到时候我会专门出一期,来谈谈如何避免这类问题的发生。