一位同事被要求提供套接字客户端和服务器应用程序的起点,我可以根据客户的需求进行调整。他提供了比我想象的更多的东西,并为我提供了一个很好的Python编程课程。
但他将程序定位到Python 2.7。我花了整整一段时间在这家公司试图把它拖到20世纪。 (请注意,我没有说21日。)我想使用Python 3.2(不是3.5,因为除了我之外的每个人都使用PythonWin,它赢得了3.5。我使用PyCharm)。
我的同事提供的代码使用ctypes模块的Structure和Union类。在Python 3.2中,__init__
方法的第一行抛出此异常:TypeError:期望的字符串,str找到。在Python 3.5中,错误是" TypeError:期望的字节,str found。"在Python 2.7中,没有错误,代码可以工作。
这是我第一次遇到ctypes模块,当我开始这个项目时,我只遇到了Python 3。有人能告诉我我需要做些什么才能让它发挥作用吗?
以下是代码:
class AliveMsg(Structure):
"""
"""
_pack_ = 1
_fields_ = [("Header", MsgHeader), # Header
("EndFlag", c_char * 1)] # End Flag always '#'
class TransAlive(Union):
length = 49
_pack_ = 1
_fields_ = [("Struct", AliveMsg),
("Message", c_char * 49),
("Initialize", c_char * 49)]
def __init__(self):
self.Initialize = ' ' * 49
self.Struct.Header.START_FLAG = '*'
self.Struct.Header.SEP1 = ';'
self.Struct.Header.SEP2 = ';'
self.Struct.Header.SEP3 = ';'
self.Struct.Header.SEP4 = ';'
self.Struct.Header.HEADER_END = 'Data:'
self.Struct.EndFlag = '#'
答案 0 :(得分:2)
为c_char
使用字节字符串而不是Unicode字符串。 Unicode字符串是Python 3中的默认字符串,但字节字符串是Python 2中的默认字符串。例如:
self.Initialize = b' ' * 49
如果您将文本分配给Message
,要使用非ASCII,您可以使用Unicode字符串,但使用适当的编码将其编码为字节字符串:
self.Message = 'Some Chinese: 马克'.encode('utf8')