2010-08-10 77 views
7

我很想嘗試在我的應用程序中嵌入Python,讓用戶在應用程序環境中運行Python腳本,訪問內部(C++實現的)對象等等。我對此很陌生,所以不知道正是我在做什麼。我看過Embedding Python in Another Application,雖然這似乎只是談論一個C API和平面C函數,而不是類或對象(除非我錯過了某些東西),它的「C++嵌入式Python」部分只有兩句話長。但是,我也遇到過how to use boost::python,這看起來不錯。我應該如何將Python嵌入到C++ Builder/Delphi 2010應用程序中?

有一個問題:boost :: python is not supported by C++ Builder 2010

因此,鑑於此,將Python嵌入到用C++ Builder 2010編譯的C++應用程序中的最佳方法是什麼,並且使用哪種技術最好,如何公開/整合類和對象以提供Python編碼器訪問程序的面向對象內部?我錯過了一個標準的方法嗎?將內部類或實例化對象暴露給Python,因爲對象容易,或者API是真正的C風格還是平面/非OO,如果是的話,通過這樣的API模仿底層OO層的最佳方法是什麼?

注意:我實際上使用RAD Studio,它包括C++ Builder和Delphi。有可能使用某種特定於Delphi的綁定,但我遇到的那些是six or seven years old,或者是新ish(Python 2.6),但don't seem to have any documentation並且在問題列表中有如"Anyone reads thiese [sic] comments anyway? Anyone working on this project?"這樣的評論,這不是令人鼓舞的。但是,請隨意包含特定於Delphi的答案,特別是如果您認爲它們可能會在D + CB組合應用程序中工作。即使他們不完美,我也很感激所有的答案 - 我可以研究,我只需要指出去哪裏。然而,本地C++解決方案可能是理想的,因爲使用VCL派生的對象有其自身的侷限性。

感謝您的輸入!

回答

8

您不應該害怕谷歌組的P4D項目。它看起來不活躍,部分原因是它已經非常穩定且功能全面。這些組件被用在更爲活躍的PyScripter應用程序中,該應用程序是當前可用的最好的Python開發編輯器之一。 PyScripter是用Delphi編寫的,使用P4D組件。因此,它也提供了一個非常全面的例子,說明如何使用P4D組件,儘管P4D源代碼結賬提供的示例已經足夠好,可以開始使用。

+1

好的,謝謝。我沒有從它的網站上知道它的穩定性。 – 2010-08-16 02:29:57

1

是暴露的內部類或 實例化對象Python作爲 對象容易,或者是API真正 C風格或平/非面向對象的,如果是這樣 什麼是最好的方式來模仿 底層OO層通過這樣一個 API?

你已經回答了你自己。這句話的後半部分是正確的。

只要編譯時,對象和類就不存在於C++中,只有少數結構(vtables),還有另一些解釋一些OO數據,前提是RTTI被激活。這就是爲什麼使用類和對象來彌補Python和C++之間的差距的原因。

您可以自己構建它,創建一組C函數以及一些數據結構,然後創建一個OO層。但是你不能那樣做。

例如,類車:

class Car { 
public: 
    int getDoors() 
     { return this->doors; } 
protected: 
    int doors; 
}; 

被翻譯成:

struct Car { 
    int doors; 
}; 

int Car_getDoors(Car * this) 
{ 
    return this->doors; 
} 

並以getDoors呼叫:

c->getDoors() 

被翻譯爲:

Car_getDoors(c) 
+0

謝謝......我的確知道這大概是通常如何實現OO :)所以你基本上說要通過傳遞這個/自己到處來重新創建一個OO類接口?似乎可怕的笨拙:( – 2010-08-16 02:31:14

+0

是的,它是笨拙的,雖然它是如何實現的。是的,如果你打算建立自己的OO接口,你應該處理所有這些。除了使用另一個現有的接口之外沒有別的選擇。 – Baltasarq 2010-08-16 13:22:37

+0

那麼,使用另一個接口是我所問的,我不想重新創建Python/CPP鉤子 - 如果有一個我可以用於編譯器的現有框架,那就是我所追求的。我必須重新創建一切,我將簡單地使用另一種語言,因爲它有更好的支持! – 2010-08-24 23:52:36

0

您可以使用swig生成C++到$ SCRIPTLANG包裝。

相關問題