运行 python 脚本时如何防止 `LD_LIBRARY_PATH` 被覆盖为 pwd

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

我有一个 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
与第二个例子的内容相同

我想知道是否有办法查看此变量的更改位置和/或为什么会发生这种情况。

我知道我可以简单地在脚本中硬编码,但这是一个创可贴解决方案,我宁愿确切地知道引擎盖下发生了什么。

谢谢大家的宝贵时间。

linux bash python environment-variables shared-libraries
1个回答
0
投票

我知道我可以简单地在脚本中硬编码,但这是一个创可贴解决方案,我宁愿确切地知道引擎盖下发生了什么。

幕后发生的事情是您的

script.py
(或
script.py
导入的代码)中的某些代码设置了环境变量。

您可以运行

gdb --args python script.py
,在
setenv
putenv
上设置断点,并让GDB在环境重置时停止程序。然而,这将在 Python 运行时的某个地方停止,并且弄清楚正在运行的 Python 代码可能会变得棘手。


也就是说,设置

LD_LIBRARY_PATH
不是 首先解决“需要某些共享库的二进制文件”问题的正确方法。

更好的解决方案是使用正确的

-rpath
标志链接二进制文件,或者使用
patchelf --set-rpath
修复已经链接的二进制文件,这样二进制文件就可以正确运行without
LD_LIBRARY_PATH
.

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