12

私は自分のプロジェクトを実行しようとしてきましたが、問題が発生しました。多くのデバッグの後、問題を絞り込みましたが、続行する方法がわかりません。

いくつかの背景、私は C++ コード内で python スクリプトを使用しています。これは Python である程度文書化されており、基本的な実行可能ファイルでうまく動作させることができました。#include と -lpython2.6 で、すべてが壮大でした。

ただし、この python スクリプトを共有ライブラリ (.so) から実行すると問題が発生します。この共有ライブラリは、シミュレーション システム (OpenRAVE) によって「モジュール」として「ロード」されます。システムは、SendCommand と呼ばれる「モジュール」の仮想メソッドを使用して、このモジュールと対話します。次に、モジュールは boost::thread を開始し、python に独自のスレッドを与え、シミュレーション システムに戻ります。ただし、Python がモジュールのインポートを開始して動的ライブラリの読み込みを開始すると、次のエラーが原因で失敗すると思われます。

ImportError: /usr/lib/python2.6/dist-packages/numpy/core/multiarray.so: 未定義のシンボル: _Py_ZeroStruct

実行可能ファイルと共有ライブラリでlddを実行しましたが、違いはありません。上記のファイルで nm -D も実行しましたが、_Py_ZeroStruct は実際には未定義です。コマンドのプリントアウトが必要な場合は、喜んで提供します。どんなアドバイスでも大歓迎です、ありがとう。

完全な python エラーは次のとおりです。

トレースバック (最新の呼び出しが最後):
  ファイル「/usr/lib/python2.6/dist-packages/numpy/__init__.py」の 130 行目
    add_newdocs をインポート
  ファイル「/usr/lib/python2.6/dist-packages/numpy/add_newdocs.py」の 9 行目
    lib import add_newdoc から
  ファイル「/usr/lib/python2.6/dist-packages/numpy/lib/__init__.py」の 4 行目
    type_checkインポートから *
  ファイル「/usr/lib/python2.6/dist-packages/numpy/lib/type_check.py」の 8 行目
    numpy.core.numeric を _nx としてインポート
  ファイル「/usr/lib/python2.6/dist-packages/numpy/core/__init__.py」の 5 行目
    マルチアレイのインポート
ImportError: /usr/lib/python2.6/dist-packages/numpy/core/multiarray.so: 未定義のシンボル: _Py_ZeroStruct
トレースバック (最新の呼び出しが最後):
  ファイル「/home/constantin/workspace/OpenRAVE/src/grasp_behavior_2.py」の 3 行目
    openravepyインポートから *
  ファイル「/home/constantin/workspace/rospackages/openrave/lib/python2.6/site-packages/openravepy/__init__.py」の 35 行目
    openravepy_currentversion = loadlatest()
  ファイル "/home/constantin/workspace/rospackages/openrave/lib/python2.6/site-packages/openravepy/__init__.py"、16 行目、loadlatest
    return _loadversion('_openravepy_')
  ファイル "/home/constantin/workspace/rospackages/openrave/lib/python2.6/site-packages/openravepy/__init__.py"、19 行目、_loadversion 内
    mainpackage = __import__("openravepy", globals(), locals(), [ターゲット名])
  ファイル「/home/constantin/workspace/rospackages/openrave/lib/python2.6/site-packages/openravepy/_openravepy_/__init__.py」の 29 行目
    openravepy_int インポートから *
ImportError: numpy.core.multiarray のインポートに失敗しました
4

4 に答える 4

9

アプリケーションで同じ問題が発生し、python を実行可能ファイルにリンクせずに解決しました。

セットアップは次のとおりです。

実行可能ファイル --リンク--> ライブラリ --動的ロード--> プラグイン --ロード--> Python インタープリター

ImportErrors を回避する解決策は、プラグインがロードされた dlopen のパラメーターを変更することでしたRTLD_GLOBAL

dlopen("plugin.so", RTLD_NOW | RTLD_GLOBAL)

これにより、後でロードされる他のもの、つまり他のプラグインや Python インタープリターがシンボルを使用できるようになります。

ただし、プラグインが後で同じシンボルをエクスポートするため、シンボルの衝突が発生する可能性があります。

于 2012-10-11T17:38:15.127 に答える
2

解決策は、python2.6 ライブラリを実行可能ファイルにもリンクすることでした。

実行可能ファイルは Python 呼び出しを行いませんでしたが、Python ライブラリとリンクする必要がありました。私の共有ライブラリがpythonライブラリのシンボルを実行可能ファイルに渡さないためだと思います。私の実行可能ファイル(実行時に動的ライブラリをリンクせずにロードする)がこれらのシンボルを必要とする理由を誰かが説明できれば、それは素晴らしいことです。

明確にするために、私のプログラムモデルは次のようなものです: [My Executable] -(動的にロード)-> [My Shared Library] -(calls and links with)-> [Python shared Library]

于 2011-11-29T15:56:56.120 に答える
0

python-headers と python のランタイムを確認してください。2.5 と 2.6 のバージョンが混在しているようです。

于 2011-11-28T23:09:23.097 に答える
0

アプリケーションに認識させずにブースト python を使用する C++ 共有オブジェクトを構築する方法を示す openrave の例があります。

http://openrave.org/en/coreapihtml/orpythonbinding_8cpp-example.html

ここのcmakeファイルで「python」を検索してください:

https://openrave.svn.sourceforge.net/svnroot/openrave/trunk/src/cppexamples/CMakeLists.txt

関連情報は次のとおりです。

if( Boost_PYTHON_FOUND AND Boost_THREAD_FOUND )
  find_package(PythonLibs)
  if( PYTHONLIBS_FOUND OR PYTHON_LIBRARIES )
    if( PYTHON_EXECUTABLE )
      # get the site-packages directory
      execute_process(
        COMMAND ${PYTHON_EXECUTABLE} -c "from distutils.sysconfig import get_python_lib; print get_python_lib(1)"
        OUTPUT_VARIABLE _python_sitepackage
        RESULT_VARIABLE _python_failed)
      if( ${_python_failed} EQUAL 0 )
        string(REGEX REPLACE "[\r\n]" "" _python_sitepackage "${_python_sitepackage}")
        set(PYTHON_INCLUDE_PATH ${PYTHON_INCLUDE_PATH} ${_python_sitepackage}/numpy/core/include)
      else()
        message(STATUS "failed to get python site-package directory")
      endif()
    endif()

    include_directories(${PYTHON_INCLUDE_PATH} ${OpenRAVE_INCLUDE_DIRS})
    add_library(orpythonbinding SHARED orpythonbinding.cpp)
    target_link_libraries(orpythonbinding ${OpenRAVE_LIBRARIES} ${PYTHON_LIBRARIES} ${Boost_PYTHON_LIBRARY} ${Boost_THREAD_LIBRARY})
    set_target_properties(orpythonbinding PROPERTIES PREFIX "" COMPILE_FLAGS "${OpenRAVE_CXX_FLAGS}")
    if( WIN32 )
      set_target_properties(orpythonbinding PROPERTIES SUFFIX ".pyd")
    endif()
  endif()
endif()
于 2011-12-03T04:44:43.677 に答える