未定义的符号:在C中嵌入Python时的PyExc_ImportError

时间:2012-08-07 09:25:42

标签: c module makefile python-2.7 importerror

我正在开发一个调用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

的makefile日志

非常感谢,任何帮助都会被贬低。

3 个答案:

答案 0 :(得分:2)

我找到了解决方案。也许对其他人有用。 这是写在这里的python的一个bug http://mail.python.org/pipermail/new-bugs-announce/2008-November/003322.html 我已使用此处发布的解决方案http://www.cilogon.org/gsi-c-authz

答案 1 :(得分:2)

@user1515248 solution是仅限链接的解决方案discouraged。我正在写这个答案,以扩展他给出的链接,并提供一个更加充实的答案(这也支持他给出的链接)。

链接https://mail.python.org/pipermail/new-bugs-announce/2008-November/003322.html说:

  

我得到了以下解决方法:在mylib.c之前   PyInitialize()我可以致电dlopen("libpython2.5.so", RTLD_LAZY | RTLD_GLOBAL);

     

这有效,但我相信lib-dynload / *。所以应该依赖   libpython2.5.so.1所以这个hack不是必需的。

     

我正在使用Ubuntu 8.04和Python版本2.5.2-2ubuntu4.1。

我所要做的就是添加一行代码:

// new line of code
void*const libpython_handle = dlopen("libpython2.6.so", RTLD_LAZY | RTLD_GLOBAL);

PyInitialize();

P.S。 我在CentOS-6上。

p.p.s。 我的PyInitialize()包含在一个类中,因此dlopen() / PyInitialize()在构造函数中完成,dlclose() / PyFinalize()在析构函数中完成。

答案 2 :(得分: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