1

そのため、多くの「処理」が行われている GUI プログラムがあります。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

もちろん、私は何か間違ったものを構築しています。私のビルド システムは autotools を使用しているため、これに関連するビルド システムの一部を以下に示します...

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 を実行して、cerrnimapi lib を Python フォルダーにインストールしました。これは役に立ちません。

また、PythonAPI.cpp をメイン プログラムの SOURCES に追加しようとしましたが、役に立ちませんでした。

何か案は?役立つ追加情報を教えてください。

4

1 に答える 1

1

確認事項:

  • nm.so ファイル ( にある可能性があります) を実行し.libsて、モジュールの init func がエクスポートされていることを確認します。
  • プログラムにsys.path(PyRun_SimpleString を使用して) の値を出力させて、モジュールがどこに現れると予想されているかを確認します。インタプリタ用にのみモジュールを定義している場合は、それらを にインストールしたくないでしょう$pyexecdir
  • 組み込み Pythonの拡張の記事を読んでください。プラグイン アーキテクチャを試している場合を除き、動的ライブラリを構築する必要はまったくありません。

スタイルのポイント: and のテストの外側を試して見つける必要が$PYTHON_CONFIGあるため、 2 回 実行することはありません。$PYTHON_INCLUDE$PYTHON_LDAC_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 に答える