pySerial can be used with Python’s with statement like this:
with serial.Serial("/dev/ttyS1") as ser:
ser.write("AAAA")
ser.read(8)
I tried to see exactly what it is pySerial does to make this work, but I couldn’t find an __enter__ or __exit__ function anywhere! I ran grep -e '(__enter__)|(__exit__)' *.py from the pySerial directory, and grep didn’t find either function. How does pySerial do it?
Edit: I also tried the following to see what was called next:
import serial, pdb
with serial.Serial("/dev/ttyUSB0") as ser:
pdb.set_trace()
This brought me directly to line 433 of serialposix.py, the close() function. Does the with statement also look for open() and close() functions?
Advertisement
Answer
Serial class doesn’t implement these methods, it inherits them from io.IOBase. The relevant part from /serial/serialposix.py:
try:
import io
except ImportError:
# classic version with our own file-like emulation
class Serial(PosixSerial, FileLike):
pass
else:
# io library present
class Serial(PosixSerial, io.RawIOBase):
pass