关于module:undefined symbol:PyExc_ImportError在C语言中嵌入Python时

undefined symbol: PyExc_ImportError when embedding Python in C

我正在开发一个C共享库,该库可以调用python脚本。
当我运行应用程序时,出现以下错误:

1
2
3
4
5
6
7
8
9
10
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,则可以正常工作:

1
2
3
4
5
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 >>>

在库的编译过程中,我按照以下建议使用了此编译器选项:
将python嵌入C中,未定义符号:PyExc_ImportError
另外,我还添加了从
python-config --includes | --libs | --cflags | --ldflags

在这里您可以找到库http://pastebin.com/348rhBjM的makefile日志

  • 该命令应为:pastebin.com/jSqSnBj5,在这里,您可以找到pastebin.com/348rhBjM的整个make日志。
  • 您有很多警告,您确实应该检查! 乍一看,最严重的似乎是:globus_gfs_acl_vm.c:260:33: warning: passing argument 2 of ‘snprintf’ makes integer from pointer without a cast。 尽管可能与您的问题无关,但您应该真正尝试修复尽可能多的警告!
  • @ rdil2503:请标记为接受的答案,最好是Trevors。

@ user1515248解决方案是不建议使用的仅链接解决方案。我正在编写此答案,以扩展他给出的链接,并提供更加充实的答案(这也备份了他给出的链接)。

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

I have been given the following workaround: in mylib.c, before
PyInitialize() I can call dlopen("libpython2.5.so", RTLD_LAZY | RTLD_GLOBAL);

This works, but I believe that lib-dynload/*.so should depend on
libpython2.5.so.1 so this hack should not be necessary.

I am using Ubuntu 8.04 with Python version 2.5.2-2ubuntu4.1.

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

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

ps。
我正在使用CentOS-6。

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

  • 不要忘记说它必须包含在#include 中以支持dlopen和RTLD_LAZY

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

  • 第一个链接mail.python.org/pipermail/new-bugs-announce/2008-November/提供了简洁明了的问题陈述和解决方案。
  • 第二个链接cilogon.org/gsi-c-authz漫长而曲折,是为一个特定的应用程序编写的,我找不到任何看起来像通用解决方案的东西。 一定要去第一个链接

我使用这样的解决方法:从lib-dynload目录中显式链接插件(很简单,然后在代码中显式dlopen)。 datetime.so的示例:

cmake:

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

或者只是将/usr/lib/python2.7/lib-dynload/datetime.so添加为链接器参数
命令行中的gcc:

1
g ++  -shared  -o libfoo. so foo. o  -lbar  -lzab  /usr /lib /python2.7 /lib -dynload /datetime. so
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值