2013-07-15 57 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上打開並運行?你怎麼看? –

相關問題