所以我有一個GUI程序,有很多「東西」在繼續。我正在添加一個python腳本界面,以便有人可以與此環境進行交互。我使用boost python。所以我的第一件事就是我想創建一個新的模塊。爲簡單起見,現在我只是模塊是世界你好...嵌入在C++中的Python
#include <boost/python.hpp>
char const* greet() {
return "hello, world" ;
}
BOOST_PYTHON_MODULE(cerrnimapi) {
boost::python::def("greet", greet) ;
}
在我的系統我有一個類,看起來像這樣...
Controller::Controller() {
Py_Initialize() ;
main_module = boost::python::import("__main__") ;
main_namespace = main_module.attr("__dict__") ;
}
void Controller::execute_script(std::string filename) {
try {
boost::python::api::object ignored =
boost::python::exec_file(filename.c_str(), main_namespace) ;
} catch(boost::python::error_already_set const &) {
if (PyErr_ExceptionMatches(PyExc_ZeroDivisionError)) {
} else {
PyErr_Print();
}
}
}
現在,當我去執行腳本我得到一個錯誤的圖形用戶界面...
Traceback (most recent call last):
File "/home/mokon/repository/trunk/python.py", line 1, in <module>
import cerrnimapi
ImportError: No module named cerrnimapi
所以當然,我構建了一些錯誤。我的構建系統使用自動工具使這裏有涉及到這一點,構建系統的幾件...
在configure.ac:
AM_PATH_PYTHON
AC_ARG_VAR([PYTHON_INCLUDE], [Include flags for python, bypassing python-config])
AC_ARG_VAR([PYTHON_CONFIG], [Path to python-config])
AS_IF([test -z "$PYTHON_INCLUDE"], [
AS_IF([test -z "$PYTHON_CONFIG"], [
AC_PATH_PROGS([PYTHON_CONFIG],
[python$PYTHON_VERSION-config python-config],
[no],
[`dirname $PYTHON`])
AS_IF([test "$PYTHON_CONFIG" = no], [AC_MSG_ERROR([cannot find python-config for $PYTHON.])])
])
AC_MSG_CHECKING([python include flags])
PYTHON_INCLUDE=`$PYTHON_CONFIG --includes`
AC_MSG_RESULT([$PYTHON_INCLUDE])
])
AC_ARG_VAR([PYTHON_LD], [Linker flags for python, bypassing python-config])
AS_IF([test -z "$PYTHON_LD"], [
AS_IF([test -z "$PYTHON_CONFIG"], [
AC_PATH_PROGS([PYTHON_CONFIG],
[python$PYTHON_VERSION-config python-config],
[no],
[`dirname $PYTHON`])
AS_IF([test "$PYTHON_CONFIG" = no], [AC_MSG_ERROR([cannot find python-config for $PYTHON.])])
])
AC_MSG_CHECKING([python linker flags])
PYTHON_LD=`$PYTHON_CONFIG --ldflags`
AC_MSG_RESULT([$PYTHON_LD])
])
在我的OBJ /目錄Makefile.am ...
pyexec_LTLIBRARIES = cerrnimapi.la
cerrnimapi_la_SOURCES = ${SRC_DIR}/lib/PythonAPI.cpp
cerrnimapi_la_LDFLAGS = -avoid-version -module $(PYTHON_LD)
cerrnimapi_la_CXXFLAGS = $(PYTHON_INCLUDE)
我的makefile和我的主程序一起構建了共享庫及其obj文件夾。這沒有幫助。我也做了一個make install來安裝cerrnimapi lib到python文件夾中。這沒有幫助。
我也嘗試將PythonAPI.cpp添加到我的主程序源中,但無濟於事。
任何想法?讓我知道什麼額外的信息會有幫助。
另外,更多的,我想想我認爲我做錯了。我不應該只是能夠將我的庫編譯到我的C++程序中,嵌入式python interp將能夠看到符號? –
您的構建過程是否生成名爲「cerrnimapi.so」的共享庫?這就是進口要尋找的東西。至於圖書館中的靜態鏈接,這不是直接鼓勵,但如果你想破解它,這裏有信息:http://mdqinc.com/blog/2011/08/statically-linking-python-with-cython-generated-模塊和 - 包/。 –