gpt4 book ai didi

Python 导入模块但启动时无法识别它?

转载 作者:太空宇宙 更新时间:2023-11-03 17:05:02 25 4
gpt4 key购买 nike

老实说,我不知道为什么会发生这种情况,我认为由于它不在堆栈交换中,这对我来说是一个非常错误的错误。所以这是错误:

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)UnboundLocalError:赋值前引用局部变量“socket”

tcpServer.py

import socket

def Main():
UID = 1001
sockets = []
users = [] ## create usernames list
sessionLimit = input("session Queue Limit: ")

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('192.168.1.74', 12127))

s.listen(sessionLimit) ## listen for 1 connection at a time

while True:
c, addr = s.accept()
sockets.append(c)
users.append(c.recv(1024).decode('utf-8'))
print("Connection from " + str(addr))

data = c.recv(1024).decode('utf-8') ## recieve 1024 bytes from client at a time, and then decode it into utf-8
if not data:
break

temp == data
temp.split(" ")
if temp[0] == "//": ## check to see if user has sent command
if temp[1] == "msg":
for i in range(len(users)):
if users[i] == temp[2]:
sockets[i].send((" ".join(temp[::2])).encode('utf-8'))
else: ## else, send data to all users. Could just use s.sendall(data.encode('utf-8'))
for socket in sockets:
socket.send(data.encode('utf-8')) ## send to sockets[socket]

##print("From connected user: " + data)
##data = data.upper()
##print("Sending: " + data)
##c.send(data.encode('utf-8'))

## command listening
commands = input("-> ")
commands.split(" ")

if commands[0] == "exit":
c.close() ## close connection
elif commands[0] == "/msg":
for i in range(len(users)):
if users[i] == commands[1]:
sockets[i].send((" ".join(commands[::1])).encode('utf-8'))
"""
elif commands[0] == "/rename": ## dont implement yet, due to users[] length changing
for i in range(len(users)):
if users[i] == commands[1]:
sockets[i].send("<server_" + UID + "> rename " + commands[2].encode('utf-8'))
"""
c.close()

if __name__ == "__main__":
Main()

感谢您的帮助!- 雅各布

最佳答案

问题是,当您执行以下代码块时,您在 Main() 函数的上下文中使用了变量名称 socket:

    for socket in sockets:
socket.send(data.encode('utf-8')) ## send to sockets[socket]

这会导致 socket 库出现命名问题。如果您将其更改为:

    for sock in sockets:
sock.send(data.encode('utf-8')) ## send to sockets[socket]

它将开始工作。我还必须以不同的方式缩进您的代码,以确保它全部位于您设置的 Main() 函数中,并且必须确保 input() 被解析为 int 。作为引用,这是适合我的完整代码块:

import socket

def Main():
UID = 1001
sockets = []
users = [] ## create usernames list
sessionLimit = int(input("session Queue Limit: "))

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('192.168.1.74', 12127))
s.listen(sessionLimit) ## listen for 1 connection at a time

while True:
c, addr = s.accept()
sockets.append(c)
users.append(c.recv(1024).decode('utf-8'))
print("Connection from " + str(addr))

data = c.recv(1024).decode('utf-8') ## recieve 1024 bytes from client at a time, and then decode it into utf-8
if not data:
break

temp == data
temp.split(" ")
if temp[0] == "//": ## check to see if user has sent command
if temp[1] == "msg":
for i in range(len(users)):
if users[i] == temp[2]:
sockets[i].send((" ".join(temp[::2])).encode('utf-8'))
else: ## else, send data to all users. Could just use s.sendall(data.encode('utf-8'))
for sock in sockets:
sock.send(data.encode('utf-8')) ## send to sockets[socket]

##print("From connected user: " + data)
##data = data.upper()
##print("Sending: " + data)
##c.send(data.encode('utf-8'))

## command listening
commands = input("-> ")
commands.split(" ")

if commands[0] == "exit":
c.close() ## close connection
elif commands[0] == "/msg":
for i in range(len(users)):
if users[i] == commands[1]:
sockets[i].send((" ".join(commands[::1])).encode('utf-8'))
"""
elif commands[0] == "/rename": ## dont implement yet, due to users[] length changing
for i in range(len(users)):
if users[i] == commands[1]:
sockets[i].send("<server_" + UID + "> rename " + commands[2].encode('utf-8'))
"""
c.close()

if __name__ == "__main__":
Main()

关于Python 导入模块但启动时无法识别它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34667024/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com