python - 使用 python c api 获取共享对象的完整路径

标签 python c linux gcc shared-libraries

我正致力于通过创建 C 扩展将一些 Python 代码嵌入到 KDB 数据库中。为此,我需要将我的代码编译到共享库中,并在我的 kdb q 脚本中加载共享库。我遇到的这个问题是当我尝试导入 numpy 模块时。我收到一条错误消息,指出 PyType_GenericNew 未定义。这发生在运行时而不是编译时。

我正在构建的共享库与 libpython3.5m.so 链接,但我猜这不会导出符号 golbally。当我制作一个在 main() 中导入 numpy 的测试可执行文件时,它运行良好。我能够通过调用 dlopen("libpython3.5m.so", RTLD_NOW | RTLD_GLOBAL) 在共享库中解决这个问题。但是我不太喜欢这个解决方案,因为它不是很健壮。例如,我将编译选项更改为喜欢 libpython3.4m。然后我还需要更改源代码,以便 dlopen 打开 libpython3.4m。

当我使用 -lpython3.5m 选项链接以全局导出所有符号时,有没有办法告诉 gcc?这样我就可以跳过 dlopen。

否则 python c api 中是否有一些东西可以告诉我当前正在使用的 python 共享库的路径?即类似于 dlopen(Py_GetLibraryPath(), RTLD_NOW | RTLD_GLOBAL)

最佳答案

您的问题与导出符号无关,而是与定位 PyType_GenericNew 的动态链接器有关。如果 libpython3.5m.so 在您的库路径中,而您的动态链接器没有找到它,则运行 strace ldd ./program 将提示它在哪里看起来,一个放置得当的符号链接(symbolic link)可能会让你失望。

关于python - 使用 python c api 获取共享对象的完整路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41910758/

相关文章:

c - 如何找到 malloc 调用实际使用了多少内存?

linux - 比较包含源文件和硬链接(hard link)的两个文件夹,删除孤立文件

Black Hat Python 书中的 Python 嗅探

python - 将鼠标事件函数与 tensorflow 一起用于对象检测时列出索引超出范围错误

python - 从 ms sql 迁移到 postgres 非 ascii 字符错误 python

c++ - 你如何在 Linux 上用 C++ 播放或录制音频(到 .WAV)?

linux - 为什么我的数值算法在两台不同的机器上表现不同?

python - 服务器连接问题 : "socket.gaierror: [Errno 11004] getaddrinfo failed"

c - 函数中的变量是否可以保存 C 中函数旧调用的旧值?

c - linux同进程下的线程如何分配stack或内存