为啥在c中嵌入python时不能导入'math'库?
Posted
技术标签:
【中文标题】为啥在c中嵌入python时不能导入\'math\'库?【英文标题】:Why can't I import the 'math' library when embedding python in c?为什么在c中嵌入python时不能导入'math'库? 【发布时间】:2009-09-24 01:20:33 【问题描述】:我正在使用 python 2.6 文档中的示例开始尝试在 C 中嵌入一些 python。example C-code 不允许我执行以下 1 行脚本:
import math
使用线路:
./tmp.exe tmp foo bar
它抱怨
Traceback (most recent call last):
File "/home/rbroger1/scripts/tmp.py", line 1, in <module>
import math
ImportError: [...]/python/2.6.2/lib/python2.6/lib-dynload/math.so: undefined symbol: PyInt_FromLong
当我在生成的二进制文件 (tmp.exe) 上执行 nm
时,它会显示
0000000000420d30 T PyInt_FromLong
函数好像已经定义好了,为什么共享对象找不到函数呢?
【问题讨论】:
【参考方案1】:我使用的是 Python 2.6,并且我成功编译并运行了您列出的相同示例代码,而没有更改源代码中的任何内容。
$ gcc python.c -I/usr/include/python2.6/ /usr/lib/libpython2.6.so $ ./a.out 随机随机数 1 100 通话结果:39 $ ./a.out 随机随机数 1 100 通话结果:57我特别选择了random
模块,因为它确实有from math import log,...
,所以它肯定也在导入math
模块。
您的问题可能是由于您的链接方式;有关其他人遇到的类似问题,请参阅 this forum post。我无法再次找到链接,但在尝试链接 Python 的静态库然后导入需要动态库的模块时似乎存在一些常见问题。
【讨论】:
接下来,您几乎可以肯定没有正确链接 Python 库。动态链接器正在尝试解析该符号,但在您的任何链接库中都找不到它。静态链接通常不会将符号保留在适当的位置以供动态链接器解析,因此在这种情况下最好动态链接。 我可以强迫你们两个回答这个问题的续集吗?不幸的是,我的 python 安装似乎不完整,我没有 libpython2.6.so ***.com/questions/1472828/…以上是关于为啥在c中嵌入python时不能导入'math'库?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 CPython 3.4.3 不能导入“_socket”模块?
从 C++ 应用程序中的嵌入式 Python 调用时,多数组扩展库上的 Numpy 导入失败