在Python3下打破的iokit.IOServiceGetMatchingServices?

时间:2015-06-13 07:27:23

标签: python macos python-3.x pyserial

我刚刚运行Yosemite的Mac mini(我通常使用linux)。我试图让serial.tools.list_ports.comports()在Python3下工作。

我已将问题缩小到以下代码片段(从pyserial中提取):

DistrictId

如果我在python2下运行它,那么它可以正常工作:

import ctypes
from ctypes import util

iokit = ctypes.cdll.LoadLibrary(ctypes.util.find_library('IOKit'))

kIOMasterPortDefault = ctypes.c_void_p.in_dll(iokit, "kIOMasterPortDefault")

iokit.IOServiceMatching.restype = ctypes.c_void_p

iokit.IOServiceGetMatchingServices.argtypes = [ctypes.c_void_p, ctypes.c_void_p, ctypes.c_void_p]
iokit.IOServiceGetMatchingServices.restype = ctypes.c_void_p

serial_port_iterator = ctypes.c_void_p()

print('kIOMasterPortDefault =', kIOMasterPortDefault)

response = iokit.IOServiceGetMatchingServices(
    kIOMasterPortDefault,
    iokit.IOServiceMatching('IOSerialBSDClient'),
    ctypes.byref(serial_port_iterator)
)
print('serial_port_iterator =', serial_port_iterator)

然而,当我在Python3下运行它时,它失败了(serial_port_iterator保持为c_void_p(无))

382 >python bug.py 
('kIOMasterPortDefault =', c_void_p(None))
('serial_port_iterator =', c_void_p(4355))

有人知道为什么这会在Python3下失败,也许如何解决它?

1 个答案:

答案 0 :(得分:1)

好的 - 想通了。

Python3将字符串作为unicode(宽)字符串传递,而Python2将字符串作为窄字符串传递。

所以改变这一行

iokit.IOServiceMatching('IOSerialBSDClient'),

阅读

iokit.IOServiceMatching(b'IOSerialBSDClient'),

使其适用于Python2和3。

现在看看我是否可以改变pyserial。