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
|
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
2022-07-19 李超:WebRTC传输与服务质量
2021-07-19 FFmpeg内存模型与API介绍(notes 2)
2018-07-19 centOS7服务管理与启动流程
2018-07-19 CentOS 6和CentOS 7防火墙的关闭
2018-07-19 linux 系统安装配置 zabbix服务(源码安装)
2018-07-19 zabbix_agentd客户端安装与配置(Linux操作系统)
2018-07-19 zabbix_agentd客户端安装与配置(windows操作系统)