gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 12:35:43 24 4
gpt4 key购买 nike

我正致力于通过创建 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com