我有一个 python 脚本,它最终调用一个需要某些共享库的二进制文件。但是,我一直遇到以下错误:
error while loading shared libraries: libmkl_rt.so: cannot open shared object file: No such file or directory
我已将此错误的原因缩小为 python 将
LD_LIBRARY_PATH
覆盖为 PWD。通过 bash 手动执行二进制文件时,一切正常,因为此环境变量已正确设置。以下是当前行为的示例:
$ echo $LD_LIBRARY_PATH
/the/proper/paths
$ echo python
>>> import os
>>> os.environ.get('LD_LIBRARY_PATH')
/the/proper/paths
$ python script.py
/my/present/working/directory
这里,
script.py
与第二个例子的内容相同
我想知道是否有办法查看此变量的更改位置和/或为什么会发生这种情况。
我知道我可以简单地在脚本中硬编码,但这是一个创可贴解决方案,我宁愿确切地知道引擎盖下发生了什么。
谢谢大家的宝贵时间。
我知道我可以简单地在脚本中硬编码,但这是一个创可贴解决方案,我宁愿确切地知道引擎盖下发生了什么。
幕后发生的事情是您的
script.py
(或script.py
导入的代码)中的某些代码设置了环境变量。
您可以运行
gdb --args python script.py
,在setenv
和putenv
上设置断点,并让GDB在环境重置时停止程序。然而,这将在 Python 运行时的某个地方停止,并且弄清楚正在运行的 Python 代码可能会变得棘手。
也就是说,设置
LD_LIBRARY_PATH
不是 首先解决“需要某些共享库的二进制文件”问题的正确方法。
更好的解决方案是使用正确的
-rpath
标志链接二进制文件,或者使用patchelf --set-rpath
修复已经链接的二进制文件,这样二进制文件就可以正确运行withoutLD_LIBRARY_PATH
.