错误-ValueError:以int()为基数10的int()无效文字:'

时间:2019-03-20 09:09:55

标签: python sockets pygame

我正在使用Sockets模块和python中的pygame制作在线游戏。

def read_pos(str):
    if str is not None:
        string = str.split(",")
        return int(string[0]), int(string[1])
    else:
        pass

def make_pos(tup):
    return str(tup[0]) + "," + str(tup[1])


def redrawWindow(win,player, player2):
    win.fill((255,255,255))
    player.draw(win)
    player2.draw(win)
    pygame.display.update()


def main():
    run = True
    n = Network()
    startPos = read_pos(n.getPos())
    p = Player(startPos[0],startPos[1],100,100,(0,255,0))
    p2 = Player(0,0,100,100,(255,0,0))
    clock = pygame.time.Clock()

    while run:
        clock.tick(60)
        p2Pos = read_pos(n.send(make_pos((p.x, p.y))))
        p2.x = p2Pos[0]
        p2.y = p2Pos[1]
        p2.update()

这是我在客户端中使用的代码。在我的服务器中,代码如下

def convertPos(str):
    if str is not None:
        str = str.split(",")
        return int(str[0]), int(str[1])
    else:
        pass

def make_pos(tup):
    return str(tup[0]) + "," + str(tup[1])


pos = [(0,0),(100,100)]


def threaded_client(conn,player):
    conn.send(str.encode(make_pos(pos[player])))
    reply = " "
    while True:
        try:
            data = conn.recv(2048).decode()
            pos[player] = data

            if not data:
                print("Disconnected")
                break
            else:
                if player == 1:
                    reply = (pos[0])
                else:
                    reply = (pos[1])
                print("Received: ", data)
                print("Sending : ", reply)

            conn.sendall(str.encode(make_pos(reply)))
        except:
            break

    print("Lost connection")
    conn.close()

我遇到了ValueError: invalid literal for int() with base 10: ' '.

错误

有人可以告诉我为什么会这样吗? str函数中的convertPos()值以元组的形式出现,我将其转换为字符串,然后转换为整数。

2 个答案:

答案 0 :(得分:0)

当您将其转换为字符串时,格式为(x,y),因此需要删除方括号。您需要将convertPos函数重写为:

def convertPos(str):
    if str is not None:
        str=str.strip("()")
        str = str.split(",")
        return int(str[0]), int(str[1])

编辑。您没有使用else部分,因此可以将其删除。

正如@Azat Ibrakov所说,您不应该将元组转换为字符串,但是如果需要这样做,则可以使用ast.literal_eval,如下所示:

import ast
def convertPos(str):
    return ast.literal_eval(str)

或直接使用它代替convertPos函数。

答案 1 :(得分:0)

很明显-正如其他人指出的那样,返回的错误是因为您试图将空字符串(或空格)转换为整数。

但是真正的问题是传入的坐标格式不正确。该代码未捕获此错误。您可以编写许多代码来确定错误是什么,并报告准确的错误。或者只是就好像一切都很好一样顺其自然,而且还可以通过合理的错误消息捕获任何异常。

def convertPos(str):
    coord = None
    try:
        parts = str.split( ',', 2 )
        x = int( parts[0] )
        y = int( parts[1] )
        coord = ( x, y )
    except:
        raise ValueError( 'Malformed co-ordinate string [' + str.strip() + ']' )
    return coord

我怀疑套接字代码没有缓冲完整的数据包,也许正在处理的内容类似于122,,而套接字缓冲需要保持读取状态,直到到达完整的坐标为止。

因此,您可以对坐标进行空格填充,以说出一个11个字符的块-这样,您便知道您必须已接收11个字符才能具有有效的坐标字符串。另外,也可以使用|之类的和坐标结束标记,然后套接字代码会不断抛光输入坐标,直到|到达为止。