为啥在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 导入失败

为啥必须在 C 中链接数学库?

导入 matplotlib.pyplot 时嵌入式 python 崩溃

为啥 Python 不能从 PIL 导入图像?

pandas库明明安装成功了,为啥总是导入错误?