为何在main()中使用socket模块出现未解析引用?已导入socket
问题分析与解决
报错原因
你在main函数里写的s = socket = socket.socket(...)是问题根源——Python里,只要函数内部有对某个变量的赋值操作,就会把这个变量标记为局部变量,哪怕全局作用域里已经有同名的socket模块。
执行这行代码时,Python会先尝试计算右边的socket.socket(...),但此时它已经把socket当成了局部变量,而这个局部变量还没被赋值,自然就抛出了UnboundLocalError。
解决方案
方案1:改掉冲突的局部变量名
最直接的办法是不用socket当局部变量名,直接用s接收套接字对象:
def main(): """ Preparing socket interface """ log.info("Preparing socket: {} )".format(SOCKET_PATH)) s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) if os.path.exists(SOCKET_PATH): os.remove(SOCKET_PATH) s.bind(SOCKET_PATH) s.listen(5) s.settimeout(1)
方案2:声明socket为全局变量(不推荐)
如果非要用socket当局部变量名,可以先声明它是全局的,但这样会覆盖全局的模块引用,后续函数里再想用socket模块的其他方法就会出问题:
def main(): """ Preparing socket interface """ global socket log.info("Preparing socket: {} )".format(SOCKET_PATH)) s = socket = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) if os.path.exists(SOCKET_PATH): os.remove(SOCKET_PATH) s.bind(SOCKET_PATH) s.listen(5) s.settimeout(1)
方案3:给模块起别名(推荐)
导入模块时给它起个独特的别名,从根源避免命名冲突:
import socket as sock def main(): """ Preparing socket interface """ log.info("Preparing socket: {} )".format(SOCKET_PATH)) s = sock.socket(sock.AF_UNIX, sock.SOCK_STREAM) if os.path.exists(SOCKET_PATH): os.remove(SOCKET_PATH) s.bind(SOCKET_PATH) s.listen(5) s.settimeout(1)
内容的提问来源于stack exchange,提问作者Nir Vana
相关产品推荐
相关产品推荐

