我必须明确关闭 pySerial 连接吗?
Do I have to close a pySerial connection explicitly?
我写了这个 class 连接到继电器板并允许我发送命令来关闭和打开它上面的不同继电器。
class relay_board:
def __init__(self, com_port):
self.com_port = com_port
self.ser = serial.Serial(self.com_port, 9600, timeout=2)
self.shorttime = 0.01
def send_command(self, bank, ports):
self.bank = bank
self.ports = ports
message = bank+ports
self.ser.write(message)
time.sleep(0.01)
我是这样称呼它的,
relay_one = relay_board.relay_board('COM3')
relay_one.send_command(b'\x42', b'\x00')
relay_one.send_command(b'\x43', b'\x3F')
程序完成后 class 会破坏 self.ser 还是我必须添加 __del__
或 def close_serial()
函数来关闭串行连接结束了吗?
Serial
对象 has a __del__
method 做你想做的,所以你不需要写它。
话虽如此,您不应该依赖 __del__
被调用。出于与 you shouldn't leave files opened 相同的原因,您不应该依赖垃圾收集器为您关闭东西。事实上,在解释器关闭期间,没有理由对您的对象进行垃圾回收,因为 OS 无论如何都会回收此内存,因此 CPython 以外的实现不会真正打扰。这样做的原因是这些对象持有 OS 资源的句柄,当程序关闭时这些资源可能不会关闭。
因此,为确保正确释放句柄,您应该 close()
自己设置串行端口,而不是等待解释器关闭为您完成。
我写了这个 class 连接到继电器板并允许我发送命令来关闭和打开它上面的不同继电器。
class relay_board:
def __init__(self, com_port):
self.com_port = com_port
self.ser = serial.Serial(self.com_port, 9600, timeout=2)
self.shorttime = 0.01
def send_command(self, bank, ports):
self.bank = bank
self.ports = ports
message = bank+ports
self.ser.write(message)
time.sleep(0.01)
我是这样称呼它的,
relay_one = relay_board.relay_board('COM3')
relay_one.send_command(b'\x42', b'\x00')
relay_one.send_command(b'\x43', b'\x3F')
程序完成后 class 会破坏 self.ser 还是我必须添加 __del__
或 def close_serial()
函数来关闭串行连接结束了吗?
Serial
对象 has a __del__
method 做你想做的,所以你不需要写它。
话虽如此,您不应该依赖 __del__
被调用。出于与 you shouldn't leave files opened 相同的原因,您不应该依赖垃圾收集器为您关闭东西。事实上,在解释器关闭期间,没有理由对您的对象进行垃圾回收,因为 OS 无论如何都会回收此内存,因此 CPython 以外的实现不会真正打扰。这样做的原因是这些对象持有 OS 资源的句柄,当程序关闭时这些资源可能不会关闭。
因此,为确保正确释放句柄,您应该 close()
自己设置串行端口,而不是等待解释器关闭为您完成。