VSCode运行Python socket代码报循环导入属性错误如何解决
报错原因
从错误回溯栈可以定位到核心问题:你运行代码的桌面目录下存在一个自定义命名为socket.py的文件。Python导入模块时会优先检索当前工作目录下的文件,因此代码执行import socket时,没有加载Python官方标准库的socket模块,反而加载了你自己写的这个同名socket.py文件。
你自定义的socket.py文件第3行写了from xmlrpc.client import Server,而xmlrpc.client模块依赖标准库http.client,http.client初始化时需要调用标准库socket的_GLOBAL_DEFAULT_TIMEOUT属性,但此时被加载的socket是你自己写的、还没完成初始化的同名文件,不存在这个属性,最终触发了循环导入类的AttributeError,这个报错和VSCode编辑器本身没有关系。
另外你写的测试代码本身还存在一处语法错误:socket.gethostname是函数对象,你没有加括号执行调用,就算解决了文件名冲突也会触发后续报错。
修复步骤
- 找到桌面路径下你自己创建的
socket.py文件,将其重命名为和Python标准库不冲突的名称,比如socket_test.py即可。注意平时写Python代码时,禁止用标准库已有的模块名给自己的代码文件命名,常见的雷区包括socket.py、requests.py、threading.py、os.py等。 - 删除同目录下自动生成的
__pycache__文件夹,清除旧的模块导入缓存,避免缓存残留导致报错复现。 - 修正测试代码中的函数调用错误,给
gethostname加上执行括号,修正后的完整可运行代码如下:
import socket import threading PORT = 5050 SERVER = socket.gethostbyname(socket.gethostname()) print(SERVER)
重新运行代码即可正常输出本机IP地址。
内容的提问来源于stack exchange,提问作者Zyther Crez
相关产品推荐
相关产品推荐

