2010-09-23 54 views
8

我對C++非常陌生,而且遇到了一個我無法通過閱讀文檔解決的問題。將腳本語言集成到C++應用程序

我想將腳本語言嵌入到我的C++應用程序中。該語言可以是JavaScript,lua或最好是python。

我不是在尋找類似Boost.Python/swig的東西,它能夠將我的C++函數/類包裝到python界面,而是一個python_evaluate_and_return_result_as_variable("my_code");函數。

我有一大堆包含了幾個整數結構的:

struct my_integers { 
    int a; 
    int b; 
    int c; 
    int d; 
    int e; 
}; 

現在我想要做一些數學與這些整數,例如:

i.a = i.c * i.e; 

我想要做的數學將來會發生很大的變化,我需要其他人能夠在不訪問C++代碼的情況下改變數學運算。

我在想一個代碼結構是這樣的:

  1. 我初始化我的結構,並與初始值
  2. 填補它,我加載外部Python功能,可以說「my_python_function」,即取該結構作爲參數並在返回之前與它進行數學運算。
  3. 我得到我的結構像i = my_python_function_cppwrapper(i)

是類似的東西可能嗎?我google了很多,但我似乎找到的唯一東西是提供C++ - > python(或其他方式)functionallity的包裝,沒有真正與變量交互。

我會非常感謝任何幫助,
羅賓。

+0

爲什麼不使用Boost.Python?它的作品,並會讓你做到你想要的。 – wilx 2010-09-23 16:43:10

回答

8

爲什麼不使用Boost.Python?您可以將您的數據類暴露給Python,並按here所述執行腳本/函數。

+0

非常感謝您,這正是我一直在尋找的。當我查看Boost.Python時,我一定錯過了該部分。 – Robin 2010-09-24 07:27:09

2

如何嵌入JavaScript引擎,如V8

+0

我認爲我堅持使用python,但我可能會在下一個項目中使用V8。感謝提示,我能想到的唯一的javascript引擎是spidermonkey。 – Robin 2010-09-24 07:28:26

6

如果您只想從C/C++運行Python腳本,請使用the Python C API。在您的C/C++代碼中:

PyRun_SimpleString("import math; x = math.sqrt(2 * 2)"); 

對於更復雜的事情,您必須查看API文檔,但它非常簡單。

+0

這對我來說不太合適,因爲我需要傳遞和提取變量,但感謝您的評論:) – Robin 2010-09-24 07:27:47

1

不要忘記嵌入式腳本語言的盛大爸爸 - tcl。

TCL爲V很不錯的C++包裝(仿照Boost.Python的),這使得它微不足道的調用和回調線了你的代碼

1

Lua中工作得也很好,特別是因爲它的小,是ANSI C兼容,擁有較低的內存足跡以及出色的維基和消息列表。如果你需要更高的速度,那麼就有一個x86 32位和64位jit版本(luajit)。綁定可以通過一系列工具/庫來完成,比如swig或者月球(wiki將它們全部列出)。我可以看到的唯一問題是綁定結構成員,以便它們可以直接引用(即:struct.member = 4),儘管可以使用獲取和設置方法綁定到變量名稱的metatable來設置它。

1

你說你不想在Python接口中包裝你的C++函數/類,但是如果你希望Python代碼能夠引用C++ my_integers結構的成員,那麼將C++類包裝到一個Python界面。當然,你可以隨心所欲地包裝儘可能多或者更少的班級 - 在這個例子中,你會打包my_integers,然後你會embed a Python interpretermy_integers的東西。

1

對於您所描述的簡單內容,您可以爲自己的「小語言」實施解釋器。你甚至可以稱之爲「羅賓」語言。 ;-)

1

我建議使用Lua作爲內部腳本引擎。實施只是幾條路線,雖然很輕鬆,但語言有足夠的力量。所以不需要TCL。你不妨看一下python,用C++進行集成相當容易,因爲存在一個促進集成的實現。

但取決於應用程序,我仍然建議Lua。