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

使用python c api获取共享对象的完整路径,python,c,linux,gcc,shared-libraries,Python,C,Linux,Gcc,Shared Libraries,我正在通过创建c扩展将一些python代码嵌入到kdb数据库中。为此,我需要将代码编译到一个共享库中,并在我的kdbq脚本中加载共享库。我遇到的这个问题是当我尝试导入numpy模块时。我收到一个错误,说PyType_GenericNew未定义。这发生在运行时而不是编译时 我正在构建的共享库与libpython3.5m相链接,所以我猜这不会导出符号。当我制作一个在main()中导入numpy的测试可执行文件时,它运行良好。通过调用dlopen(“libpython3.5m.so”,RTLD\u N

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

我正在构建的共享库与libpython3.5m相链接,所以我猜这不会导出符号。当我制作一个在main()中导入numpy的测试可执行文件时,它运行良好。通过调用
dlopen(“libpython3.5m.so”,RTLD\u NOW,RTLD\u GLOBAL),我可以在共享库中解决这个问题。然而,我并不真的喜欢这个解决方案,因为它不是很健壮。比如说,我将编译选项改为喜欢libpython3.4m。然后我还需要更改源代码,以便dlopen打开libpython3.4m

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


否则,pythoncapi中是否有东西可以告诉我当前使用的python共享库的路径?例如
dlopen(Py_GetLibraryPath(),RTLD\u NOW | RTLD\u GLOBAL)
您的问题与导出符号无关,而是与动态链接器定位
PyType\u GenericNew
有关。如果
libpython3.5m.so
在您的库路径中,而您的动态链接器找不到它,则运行
strace ldd./program
将提示它在哪里,一个位置良好的符号链接可能会帮您找到它

readelf-d youlib.so
是否显示对libpython3.5m的依赖性?链接器可能已将其剥离。它具有依赖性。