使用dlopen在Python中加载一个.so说它在同一目录中找不到另一个

问题描述 投票:1回答:2

我昨天使用SSH协议连接到另一台计算机,并尝试通过Python加载一个SO文件(将编译为C)。这是我在CLI中得到的:enter image description here

“OSError:”旁边正在请求的文件(libLMR_Demodulator.so)与我要加载的文件(libDemodulatorJNI_lmr.so)位于同一目录中。

python代码(v3.5.2)如下:

import ctypes
sh_obj = ctypes.cdll.LoadLibrary('./libLMR_Demodulator.so')
actual_start_frequency = sh_obj.getActualStartFrequency(ctypes.c_long(0))
print('The Current Actual Frequency Is: ' + str(actual_start_frequency))
python dlopen
2个回答
1
投票

@Charles Duffy是对的。问题来自依赖。您可以通过命令验证:

ldd libLMR_Demodulator.so

您有几种方法可以解决此问题:

  • 将所有lib放到/lib/usr/lib路径,或直接将它们安装到您的系统中。
  • 将libs的路径放到/etc/ld.so.conf文件中,然后运行ldconfig来刷新缓存。
  • 使用LD_LIBRARY_PATH添加libs的路径,然后尝试运行脚本 LD_LIBRARY_PATH=[..path] python [script.py]

要么

    export LD_LD_LIBRARY_PATH=[..path]
    python [script.py]

您可以查看dlopen手册以获取更多详细信息。


0
投票

我到这里寻找如何确保具有.so文件的模块/包能够加载它所依赖的另一个.so文件 - 将当前目录更改为第一个.so文件的位置(即,模块所在的目录似乎对我有用:

import os,sys,inspect
cwd = os.getcwd()
currentdir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))
os.chdir(currentdir)
import _myotherlib
os.chdir(cwd) # go back

也可能适用于OP案例?

© www.soinside.com 2019 - 2024. All rights reserved.