6

Python スクリプトを呼び出す C 共有ライブラリを開発しています。アプリケーションを実行すると、次のエラーが表示されます。

Traceback (most recent call last):
  File "/home/ubuntu/galaxy-es/lib/galaxy/earthsystem/gridftp_security/gridftp_acl_plugin.py", line 2, in <module>
    import galaxy.eggs
  File "/home/ubuntu/galaxy-es/lib/galaxy/eggs/__init__.py", line 5, in <module>
    import os, sys, shutil, glob, urllib, urllib2, ConfigParser, HTMLParser, zipimport, zipfile
  File "/usr/lib/python2.7/zipfile.py", line 6, in <module>
    import io
  File "/usr/lib/python2.7/io.py", line 60, in <module>
    import _io
ImportError: /usr/lib/python2.7/lib-dynload/_io.so: undefined symbol: PyExc_ImportError

モジュール io をコンソールからインポートしようとすると、代わりに正常に動作します。

Python 2.7.1+ (r271:86832, Apr 11 2011, 18:13:53) 
[GCC 4.5.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import galaxy.eggs
>>> 

ライブラリのコンパイル中に、このコンパイラ オプションを次のように使用しました: Embedding python in C, undefined symbol: PyExc_ImportError さらに、python-config --includes|--libs|-- から取得したコンパイラ オプションも追加しました。 cflags|--ldflags

ここでは、ライブラリのメイクファイルのログを見つけることができますhttp://pastebin.com/348rhBjM

どうもありがとう、どんな助けも高く評価されます。

4

3 に答える 3

3

私は解決策を見つけました。たぶん、他の誰かに役立つかもしれません。ここに書かれているように、これは Python のバグですhttp://mail.python.org/pipermail/new-bugs-announce/2008-November/003322.htmlここ に投稿されたソリューションを使用しましたhttp://www.cilogon.org /gsi-c-authz

于 2012-08-07T13:58:54.133 に答える
0

私はそのような回避策を使用します: lib-dynload ディレクトリからのプラグインの明示的なリンク (単純に、コードで明示的な dlopen です)。datetime.so の例:

cmake:

SET ( CMAKE_SHARED_LINKER_FLAGS "/usr/lib/python2.7/lib-dynload/datetime.so" )

または、コマンド ラインで /usr/lib/python2.7/lib-dynload/datetime.so をリンカ パラメータとして gcc に追加します。

g++ -shared -o libfoo.so foo.o -lbar -lzab /usr/lib/python2.7/lib-dynload/datetime.so
于 2012-12-24T09:13:54.250 に答える