所以我有一个GUI程序,它有很多“东西”在运行。我正在添加一个python脚本接口,这样人们就可以与这个环境进行有问题的交互。我使用的是boost python。所以我要做的第一件事就是创建一个新模块。为了简单起见,现在我的模块只是hello world…
#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();
}
}
}现在,当我在GUI中执行脚本时,我得到一个错误...
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/ dir 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在python文件夹中安装cerrnimapi lib。这没什么用。
我还尝试将PythonAPI.cpp添加到我的主程序源代码中,但无济于事。
有什么想法吗?让我知道哪些额外的信息将是有帮助的。
发布于 2012-12-27 22:54:26
以下是需要检查的内容:
.libs中)上运行nm,以确保你的模块初始化函数被导出。sys.path的值(使用PyRun_SimpleString),以查看它期望你的模块出现在哪里。如果您只为解释器定义模块,那么您可能不希望在$pyexecdir.关于风格的一点:你应该尝试在你的$PYTHON_INCLUDE和$PYTHON_LD测试之外找到$PYTHON_CONFIG,这样你就不会做两次AC_PATH_PROGS:
AM_PATH_PYTHON
AC_ARG_VAR([PYTHON_CONFIG], [Path to python-config])
AS_IF([test -z "$PYTHON_CONFIG"], [
AC_PATH_PROGS([PYTHON_CONFIG],
[python$PYTHON_VERSION-config python-config],
[no],
[`dirname $PYTHON`])
])
AC_ARG_VAR([PYTHON_INCLUDE], [Include flags for python, bypassing python-config])
AS_IF([test -z "$PYTHON_INCLUDE"], [
AC_MSG_CHECKING([python include flags])
AS_IF([test "$PYTHON_CONFIG" = no], [AC_MSG_ERROR([cannot find python-config for $PYTHON.])])
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"], [
AC_MSG_CHECKING([python linker flags])
AS_IF([test "$PYTHON_CONFIG" = no], [AC_MSG_ERROR([cannot find python-config for $PYTHON.])])
PYTHON_LD=`$PYTHON_CONFIG --ldflags`
AC_MSG_RESULT([$PYTHON_LD])
])https://stackoverflow.com/questions/13852880
复制相似问题