1

所以我有一个 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/ 目录 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 库。这没有帮助。

我也尝试将 PythonAPI.cpp 添加到我的主程序 SOURCES 但无济于事。

有任何想法吗?让我知道哪些附加信息会有所帮助。

4

1 回答 1

1

需要检查的一些事项:

  • 运行nm您的 .so 文件(可能位于.libs)以确保您的模块 init func 已导出。
  • 让你的程序打印出sys.path(使用 PyRun_SimpleString)的值,看看它期望你的模块出现在哪里。如果您只为解释器定义模块,您可能不想将它们安装在$pyexecdir.
  • 阅读扩展嵌入式 Python文章。您根本不需要构建动态库,除非您正在尝试插件架构。

关于风格的一点:你应该尝试$PYTHON_CONFIG在你的测试之外找到$PYTHON_INCLUDE$PYTHON_LD所以你不会做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])                                                   
])
于 2012-12-27T14:54:25.903 回答