Python 我必须显式关闭pySerial连接吗?

Python 我必须显式关闭pySerial连接吗?,python,pyserial,Python,Pyserial,我编写了这个类,它连接到一个继电器板,并允许我发送命令来关闭和打开它上面的不同继电器 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(sel

我编写了这个类,它连接到一个继电器板,并允许我发送命令来关闭和打开它上面的不同继电器

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')

该类是否在程序完成时销毁self.ser,或者我是否必须添加一个
\uu del\uuu
def close\u serial()
函数以在结束时关闭串行连接?

执行所需操作的
serial
对象,因此无需编写它

也就是说,您不应该依赖于调用
\uu del\uu
。出于同样的原因,您不应该依赖垃圾收集器来为您关闭东西。事实上,在解释器关闭期间,没有理由对对象进行垃圾收集,因为操作系统无论如何都会回收这个内存,所以除了CPython之外的其他实现不会真的麻烦。这样做的原因是这些对象持有操作系统资源的句柄,这些资源在程序关闭时可能无法关闭


因此,为了确保句柄得到正确释放,您应该自己
close()
串行端口,而不是等待解释器关闭来为您执行此操作。

感谢您的解释,现在它更有意义了。实际上,我已经将串行初始化移出了init函数,并将其放在get命令函数中。我还使用as
运行它,因此我认为它应该正确关闭。最后我还运行了close()以进一步确认。那么您在不发送命令的情况下保持端口关闭?我不确定串行端口中的缓冲到底是如何工作的,但是如果目标设备发回任何东西,而您没有读取它,那么它可能会将设备填充到计算机缓冲区,从而在设备等待您读取它发送给您的所有数据时将设备软锁定。我曾经在Arduino上遇到过这个问题,但我记不起具体细节。是的,我一直将其关闭,我目前使用的设备没有问题,因为它无法通过串行方式发送任何信息。它是一个只接受命令的中继板,所以这里没有问题。这是一个有效的观点,我将在未来密切关注。