我正在开发一个调用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日志非常感谢,任何帮助都会被贬低。
答案 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