为什么 serial.tools 在 os.system 内可用,但在 os.system 内可用?

Why is serial.tools available within os.system but not without?

我正在努力让 Python 从微控制器读取数据,微控制器每秒通过 COM 端口发送一个简短的状态字符串。

由于 μC(最好不要说是哪个)在 USB 实现上有一个相当狡猾的串行,我需要定期检查 COM 端口是否存在。

我可以使用 os.system('python -m serial.tools.list_ports') 到 return Eclipse 控制台中的端口。目前一切顺利。

我现在想进行下一步,将其输出传递给一个变量并进一步处理 - 这就是我解脱的地方。我原以为我可以使用例如 s = serial.tools.list_ports 进行分配,但在此上下文中 serialtools 不可用。

这是为什么?

如果你只导入serial,你不能直接访问serial.tools,因为tools是[=11]中的另一个模块(实际上是一个子包) =] 包。 serial 包不会为您导入它。一些包会自动导入它们包含的部分或全部模块和子包,但这种行为需要由包开发人员专门编码,除非您自己导入内部模块,否则 Python 不会这样做。

尝试显式导入您要使用的模块:

import serial.tools.list_ports
serial.tools.list_ports.main()

main 函数实现了您在 运行 python -m serial.tools.list_ports 时看到的行为。我通过查看 Sourceforge 上的 PySerial subversion repository 找到了它的名字。