我有一个正在工作的python 2.7程序,该程序调用DLL。我试图将脚本移植到python 3.5,但是没有成功。
这是一些示例代码:
from ctypes import ...
class NexusAdapter:
def __init__(self, search_mode=0, serial=0, sample_rate=0):
...
self._load_nexus_dll()
def _load_nexus_dll(self):
dll_path = 'GenericDeviceInterfaceDLL_x64'
self._lib_nexus = WinDLL(dll_path)
def init_generic_device(self):
result = self._lib_nexus.InitGenericDevice(
self._process_data, self._search_mode, self._serial)
return result
def get_device_info(self):
device_info = DeviceInfo()
self._lib_nexus.GetDeviceInfo(device_info)
return device_info
class DeviceInfo(Structure):
_fields_ = [("cName", c_char * 40),
("cSerialNumber", c_char * 40),
("cDescription", c_char * 40),
("cConnectionType", c_char * 40),
("dwTypeID", c_ulong),
("dwNumberOfChannels", c_ulong),
("bAuthenticated", c_bool)]
nexus_adapter = NexusAdapter(search_mode=0, serial=0, sample_rate=256)
init_res = nexus_adapter.init_generic_device()
device_info = nexus_adapter.get_device_info()
print(device_info.cName) # On py2 device name (NeXus-4) is printed.
# On py3 b'' is printed
除get_device_info之外的所有方法均与py2和py3相同。使用py3方法get_device_info返回与初始化相同的结构(例如,如果我使用以下方式初始化DeviceInfo:device_info = DeviceInfo(b'test') 然后print(device_info.cName))将打印b'test'。
因此,我认为问题与DeviceInfo结构有关。
我发现python类型在py2和py3中对于ctypes是不同的。这也写在ctypes https://docs.python.org/2.7/library/ctypes.html#fundamental-data-types的文档中 https://docs.python.org/3.5/library/ctypes.html#fundamental-data-types,但C类型相同。
在Differences in ctypes between Python 2 and 3上,我发现py2和py3中的字符串表示形式不同,但这意味着我将需要解码device_info.cName。 我没有找到解码结构的方法,但是我不确定这是否可以解决我的问题。
我认为检测设备有问题,但是如果我打开设备,init_res为0。根据{{3}},0表示“确定”。如果没有设备,则init_res将带有一些错误代码。
我不明白此代码还有什么其他问题。我是否错过了python代码中的某些内容?
编辑:
print(device_info.cSerialNumber) # py3: b'' py2: Number
print(device_info.cDescription) # py3: b'' py2: 'NeXus-4 Device'
print(device_info.cConnectionType) # py3: b'' py2: 'Bluetooth'
print(device_info.dwTypeID) # py3: 0 py2: Number
print(device_info.dwNumberOfChannels) # py3: 0 py2: 6
print(device_info.bAuthenticated) # py3: False py2: True