在 C 中嵌入 python,未定义符号:PyExc_ImportError

Posted

技术标签:

【中文标题】在 C 中嵌入 python,未定义符号:PyExc_ImportError【英文标题】:Embedding python in C, undefined symbol: PyExc_ImportError 【发布时间】:2011-06-13 14:46:39 【问题描述】:

我正在尝试为 Audacious Media Player 编写一个加载 python 模块的插件。 python嵌入代码来自python-2.6源(embed/Demo)。这用命令行编译,

gcc -o demo demo.c -lpython2.6 -lm -L/usr/lib/python2.6/config

我在 CC args 中添加了-lpython2.6 -lm -L/usr/lib/python2.6/config

它会加载一个导入 pygtkgtk 模块的 Python 脚本,这工作正常。

但是在我编译插件(一个共享库)之后,会出现以下错误(这不是我发现的gtk 所特有的,对于任何使用本机库的python 模块都是一样的)

 Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "./xyz.py", line 7, in <module>
    import gtk
  File "/usr/lib/pymodules/python2.6/gtk-2.0/gtk/__init__.py", line 30, in <module>
    import gobject as _gobject
  File "/usr/lib/pymodules/python2.6/gtk-2.0/gobject/__init__.py", line 26, in <module>
    from glib import spawn_async, idle_add, timeout_add, timeout_add_seconds, \
  File "/usr/lib/pymodules/python2.6/gtk-2.0/glib/__init__.py", line 22, in <module>
    from glib._glib import *
ImportError: /usr/lib/libpyglib-2.0-python2.6.so.0: undefined symbol: PyExc_ImportError

用于设置 python 解释器的 C 代码仅缺少 PySys_SetArgv 调用。我试图伪造它,但它导致了同样的错误!

【问题讨论】:

【参考方案1】:

假设您在 Linux 上,您需要将 -Xlinker -export-dynamic 添加到编译器行。这将导致在可执行文件中定义的符号可用于扩展模块。

在其他平台上,查看Python makefile中是否设置了LINKFORSHARED,然后使用相同的标志。

【讨论】:

pastebin.com/raw.php?i=PXZuhQE3 这是我正在使用的生成文件。我试过了,但这并没有解决问题。感谢您的回答! @madura:不要为song_change.so 使用该选项。用它来链接demo【参考方案2】:

您在 Windows 上使用 64 位 python 吗? 64 位 python26.Lib 缺少一些在 32 位 python 中可用的符号。尝试 32 位 python,您的问题应该得到解决。

【讨论】:

以上是关于在 C 中嵌入 python,未定义符号:PyExc_ImportError的主要内容,如果未能解决你的问题,请参考以下文章

嵌入式 C/C++:现有符号的未定义引用

在 C 中嵌入 Python:链接错误 - 未定义对 PyString_AsString 的引用

_ctypes.cpython-39-x86_64-linux-gnu.so:未定义符号:使用 dlopen 加载的嵌入式 Python 中的 PyFloat_Type

Python.h 中的未定义符号

ImportError:在 python 中导入 swigged c++-class 时未定义的符号

在 Python 中加载 C 共享库时出现 OSError(未定义符号:checkedCalloc)