Python 2.7 在Python中将二进制数据写入命名管道

Python 2.7 在Python中将二进制数据写入命名管道,python-2.7,pipe,ctypes,named,Python 2.7,Pipe,Ctypes,Named,几个月前,我使用MSDN->中的示例代码在GUI中实现了一个命名管道服务器 命名的管道服务器似乎工作得很好,我用它来控制我的GUI和用各种VisualStudio语言编写的其他程序 今天,我一直在尝试使用Python脚本与命名管道服务器交互。在web上,使用ctypes库很容易找到示例python代码,该代码使用windl.kernel32.CreateFileA()方法打开命名管道,并使用windl.kernel32.WriteFile()方法向其写入ASCII字节 问题在于MSDN示例使用的

几个月前,我使用MSDN->中的示例代码在GUI中实现了一个命名管道服务器

命名的管道服务器似乎工作得很好,我用它来控制我的GUI和用各种VisualStudio语言编写的其他程序

今天,我一直在尝试使用Python脚本与命名管道服务器交互。在web上,使用ctypes库很容易找到示例python代码,该代码使用windl.kernel32.CreateFileA()方法打开命名管道,并使用windl.kernel32.WriteFile()方法向其写入ASCII字节

问题在于MSDN示例使用的格式是,写入管道或从管道接收的前两个字节表示管道中要跟随的字符串的大小。虽然我可以毫无问题地从Python将字符串写入管道,但似乎无法将任何二进制数据传递到WriteFile()方法

有关解决此问题的方法的问题: 1.有没有办法将二进制数据的原始字节写入WriteFile()?我是否可以调用其他方法来处理此问题?
2.我有没有办法把二进制数编码成一个字符串作为原始字节?例如,如果我知道要提前发送的字节(例如0x1234),那么我可以只发送create\u string\u buffer(“\x12\x34”)。但是,字节必须在运行时确定,而且我还没有找到一种方法来用原始字节创建字符串。

为什么需要ctypes来写入命名管道?您应该能够打开地址并写入数据:
f=open(r'\.\pipe\some\u pipe\u 1234',wb')
f.write(数据)
f.flush()
。使用struct模块将长度打包为一个大端短(2字节):
struct.pack('>H',length)
。如果有其他方法,我很乐意尝试。然而,我使用的是web()中的示例代码,它似乎有90%是这样的,几乎没有修改。该示例代码使用ctypes,这似乎是有意义的,因为它与windows DLL接口。我来看看用你建议的方法我能取得什么进展。实际上,我最终用了一个黑客来让代码工作。我制作了一个从整数到ascii的转换列表(转换表=[“\x00”,“\x01”,“\x02”等)和一个从字符串到整数的转换字典(转换表=dict([(“\x00',0x00),(“\x01',0x01),(“\x02',0x02)等)。这很难看,但它允许我通过ascii管道发送需要发送的少量二进制字节。只需使用
struct.pack('>H',length)
将整数
长度
转换为2字节即可。