重新加载模块后找不到属性

Attribute not found after reloading the module

我已经将 LiveOverflow 的游戏代理从 this video 修改为与 Python 3.8(我正在使用的那个)一起工作。然而它吐出:

module 'parser' has no attribute 'parse'

每当任何数据包通过时 = 每当调用解析函数时。 proxy.py 文件中的代理代码如下所示:

import os
import socket
from threading import Thread
import importlib
import parser

class Proxy2Server(Thread):
    def __init__(self, host, port):
        super().__init__()
        self.host = host
        self.port = port
        self.game = None
        self.server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.server.connect((host, port))

    def run(self):
        while True:
            data = self.server.recv(4096)
            if(data):
                try:
                    importlib.reload(parser)
                    parser.parse(data, self.port, "server")
                except Exception as e:
                    print(f"[server:{self.port}] {e}")

                self.game.sendall(data)

class Game2Proxy(Thread):
    def __init__(self, host, port):
        super().__init__()
        self.host = host
        self.port = port
        self.server = None
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        sock.bind((host, port))
        sock.listen(1)
        self.game, address = sock.accept()

    def run(self):
        while True:
            data = self.game.recv(4096)
            if(data):
                try:
                    importlib.reload(parser)
                    parser.parse(data, self.port, "game")
                except Exception as e:
                    print(f"[game:{self.port}] {e}")

                self.server.sendall(data)

class Proxy(Thread):
    def __init__(self, host, destination_host, port):
        super().__init__()
        self.host = host
        self.destination_host =destination_host
        self.port = port

    def run(self):
        while True:
            print(f"[proxy:{self.port}] Setting up...")
            self.g2p = Game2Proxy(self.host, self.port)
            self.p2s = Proxy2Server(self.destination_host, self.port)
            self.g2p.server = self.p2s.server
            self.p2s.game = self.g2p.game

            self.g2p.start()
            self.p2s.start()


#Start the proxy
minecraft = Proxy("0.0.0.0", "example.com", 25565)
minecraft.start()

#Proxy command parsing
while True:
    try:
        cmd = input("$ ")

        if(cmd[:4] == "exit"):
            os._exit(0)

    except Exception as e:
        print(e)

parser.py 文件只是:

def parse(data, origin, port):
    print(f"[{origin}:{port}] {data.encode('hex')}")

两个文件都在同一个目录中。我不知道是什么原因造成的。

P.S。是的,我正在使用 Minecraft 对此进行测试。

Python 有一个内置的 parser 模块。似乎 import parser 正在导入它而不是您的本地模块。尝试将 parser.py 文件重命名为任何其他名称并相应地更改 import 语句。