2013-07-15 48 views
2

我对此有如此多的疑惑,我想我应该问一下。这里的情况:在C++插件和Python程序之间进行通信

我正在写一个C++ .dll,将被加载到一个程序,“EuroScope.exe”。加载时,程序会将数据提供给dll,这些数据将不断地发送和接收来自先前构建的python程序的数据。收到并接受数据后,该DLL将传输到正在运行的应用程序

我正在尝试使用ZeroMQ的套接字解​​决方案,大家都非常讨论这个问题。事情是,现在已经2周了,我不能在VS2012中使用它。我尝试了一切,甚至在这里,在他们的家中,在邮件列表中打开一个线程......没有人知道如何解决它

所以,除了ZeroMQ,你认为什么是我的最佳选择?我已经在那里搜索和阅读了很多(协议缓冲区我不喜欢,这对于我想要做的事情来说太复杂了)

还有一件事。绑定Python/C++(例如使用SIP或ctypes)是一种有效的解决方案还是它不能满足我的目的?我已经阅读了一些SIP和ctypes文档,看起来像我想要的......但同时我想:如果Python的C++程序可以访问的目的是什么,如果它是需要发送数据到Python的加载的dll ??我不知道,我只是不知所措有这么多的信息

非常感谢您的帮助

+0

您是否可以修改现有的Python应用程序,还是仅限于通过ZeroMQ与它通信?如果您无法更改Python应用程序的协议,那么您可能仅限于其预先存在的通信形式(套接字或ZeroMQ等)。如果您能够修改Python应用程序,那么实现一个简单的面向行的套接字服务器可能是最容易的,它读取请求字符串直到找到'\ n',处理消息并以'\ n ”。如果你只需要简单的同步发送/接收,ZeroMQ可能会矫枉过正 – linguanerd

+0

我不知道是因为有人删了论文,但我想可能不是。我可以做的也很可能要做的是一个py程序,它与以前制作的论文.py's相互作用。那么你有什么建议,简单的套接字(因为ZeroMQ不工作)? –

+0

我发布了一个可能的答案,让我知道如果这是朝着正确的方向。如果不是,我可以根据需要修改并添加更多细节。 – linguanerd

回答

0

最简单的方法之一是写,做下面一个简单的Python socket服务器:

  1. 侦听已知端口上并接受TCP连接
  2. 读取的字符串,直到找到一个“\ N”
  3. 分割上一些分隔符线,例如“”或空间如FLDS =行。 split(',')
  4. 解释第一场(FLDS [0])作为关键字,剩余的字段作为参数来调用在底层蟒程序的功能
  5. 发送一个使用“\ N”
  6. 继续结束的响应字符串请循环执行第2步到第5步,直到套接字连接关闭或收到某种“CLOSE”命令。

客户端对于这种类型的服务器的可以用C++编写或Python和将:

  1. 连接到TCP套接字已知端口
  2. 发送单行上命令,一端与“\ N”
  3. 读取响应字符串直到它找到一个“\ N”
  4. 直至所需的任务完成或插座连接被关闭重复上述处理

当我需要一个简单的点对点同步发送/接收协议实现时,我经常使用这种方法。它比ZeroMQ或其他消息排队方法的重量轻得多。

如果您需要异步通信或者有多个服务器线程正在运行,那么您可能希望查看类似ZeroMQ的东西。但是,如果我理解正确,这听起来像你的需求在这种情况下更简单。

使用字符串比传送二进制数据要慢一些,但根据我的经验,协议更容易调试,因为您不必担心大小差异&二进制类型的字节排序(int,长,短,浮,双)跨越不同的平台。而且您不必将数据包转储到文件中,然后在HEX编辑器中查看它们以告知通过线路发送的内容。只需记录文本字符串,很容易看到发生了什么。

Python在标准库中具有优秀的TCP socket server and client库支持,而.NET库有good TcpClient support,如果您决定使用C#编写客户端或决定使用托管C++,它将很好地工作。如果您要编写更传统的C++(非托管),那么您应该能够找到许多Win32套接字编程的例子,如this site with working TCP client & server Win32 socket code examples and online book

+0

我喜欢它!非常感谢你的回答,我今天会试着实现它。我会告诉你,如果我对此有任何疑问 –

+0

我会尝试并遵循[this](http://www.codeproject.com/Articles/11843/Embedding-Python-in-CC-Part- II)教程。你认为我会走在正确的方向吗? –

+0

我一直在尝试socket并思考它,我意识到我需要在C++中嵌入python,因为我正在做的是一个基本上被加载到程序中的插件,并且插件完成所有必要的事情。所以有意义的是,python程序不需要在python shell上打开并运行?你怎么看? –

相关问题