重新加载模块后找不到属性
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
语句。
我已经将 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
语句。