通过 C# 和 cPython 之间的管道交换数据
我有(我认为)相对简单的任务。我必须向某些 C# 应用程序提供一种方法来调用我的 Python 应用程序并传递一些数据进行处理并在 Python 任务结束时接收返回结果(两者都是 GUI 应用程序)。
我认为管道可以很好地完成这项工作C# 端创建一个命名管道,因此
using (NamedPipeServerStream pipeServer =
new NamedPipeServerStream("Demo", PipeDirection.InOut))
{// Wait for a client to connect
pipeServer.WaitForConnection();
应用程序可以 p/调用 python 应用程序,在 python 端传递 sysarg 等中的管道名称
,一旦管道名称已知并使用 win32pipe 之类的东西
message = 'a test'
pipeName = '\\\\.\\pipe\\Demo'
win32pipe.CallNamedPipe(pipeName, message, 4096 , win32pipe.NMPWAIT_WAIT_FOREVER)
可以工作。
应该 C# 检测到传入连接,但 python 端因臭名昭著的错误而“崩溃”:(87,'CallNmaedPipe",'参数不正确')。
我不是管道方面的专家,不知道可能出了什么问题这里。
I have what (I think) is a relatively simple task. I have to provide to some C# app a way to invoke my Python app and pass some data for processing and receive back the results at the end of the Python task (both are GUI apps.
I thought that pipes would do the job nicely with the C# side creating a named pipe thus
using (NamedPipeServerStream pipeServer =
new NamedPipeServerStream("Demo", PipeDirection.InOut))
{// Wait for a client to connect
pipeServer.WaitForConnection();
the app can p/invoke the python app passing the name of the pipe in sysarg, etc.
on the python side, once the pipe name is known and using win32pipe something like
message = 'a test'
pipeName = '\\\\.\\pipe\\Demo'
win32pipe.CallNamedPipe(pipeName, message, 4096 , win32pipe.NMPWAIT_WAIT_FOREVER)
should work.
What happens is that the C# detects the incoming connection but the python side "crashes" on an infamous error:(87,'CallNmaedPipe",'The parameter is incorrect').
I'm no expert on pipes and am at loss to see what might be wrong here.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
CallNamedPipe 需要在 PIPE_TYPE_MESSAGE 中创建的管道;您的 C# 代码在 PIPE_TYPE_BYTE 中创建一个管道。因此,您要么需要在 C# 中以消息模式创建管道(使用需要 PipeTransmissionMode 的构造函数),要么使用 WriteFile 将数据放入管道中。
CallNamedPipe requires a pipe that is created in PIPE_TYPE_MESSAGE; your C# code creates a pipe in PIPE_TYPE_BYTE. So you either need to create a pipe in message mode in C# (using a constructor that expects PipeTransmissionMode), or use WriteFile to put data into the pipe.