我在 Ubuntu 20.04.1 上的 python3.8 中的 LD_LIBRARY_PATH 遇到了一个棘手的问题。
当我执行时和我的用户以下几行:
user@host>export LD_LIBRARY_PATH=/usr/lib
user@host>echo $LD_LIBRARY_PATH
/usr/lib
user@host>python -c 'import os;print(os.getenv("LD_LIBRARY_PATH"))'
None
Python 无法访问 LD_LIBRARY_PATH(请注意,其他变量可以照常访问)。
当我执行时与根相同:
root@host>export LD_LIBRARY_PATH=/usr/lib
root@host>echo $LD_LIBRARY_PATH
/usr/lib
root@host>python -c 'import os;print(os.getenv("LD_LIBRARY_PATH"))'
/usr/lib
它运行完美。因此我怀疑这是一个安全配置,我已经尝试过:
- AppArmor(来自此openSUSE 论坛上的主题): 在我的系统上没有定义 python 的配置文件(
aa-status does
即使ps aux | grep python
产生各种正在运行的实例,也不会显示 python)。但是,在 中定义了一个抽象,/etc/apparmor.d/abstractions/python
它包含在lsb_release
和usr.bin.firefox
配置文件中。但它们都不应损害 Python 的执行。在 中创建符号链接的常用指南/etc/apparmor.d/disable
不起作用,因为没有我可以禁用的 python 配置文件。 - SELINUX(参见评论stackoverflow 线程):在我的系统中既不存在
/etc/selinux/config
也不sestatus
存在。因此,我认为它已被禁用,尽管已安装文件夹和一些软件包。为确保万无一失,我执行了setfacl -b /usr/bin/python3.8
(参见此超级用户线程) 没有任何变化。
任何形式的提示,例如其他安全标志/设置/开箱即用的解决方案(不包括从头开始重新安装系统),都将受到高度赞赏,因为我已经花了整整一天的时间。
一些可选的背景知识
我需要编译一个运行 python 脚本的 rosnode,该脚本包含带有 pybind11 的 C++ 代码,在 C++ 端,pybind11 会动态加载 中指定的文件夹中可用的库LD_LIBRARY_PATH
。当使用 conda 解释器手动执行上面共享的行时,~/anaconda3/envs/myenv/bin/python
它会正确看到库路径,因此它似乎与 中的可执行文件绑定在一起/usr/bin
。但是我无法更改 python 可执行文件,因为 pybind11 使用旧的 cmake find_package 指令,总是回退到 中的解释器/usr/bin
。解决方法是使用 rpath 变量或在运行时手动更改路径请参阅此 stackoverflow 线程不是一个选择。
完全相同的项目在另外两台运行全新安装的 Ubuntu 20.04 和 Debian 测试系统的机器上运行。因此,我最近更新的 ubuntu(从 18.04 开始)需要有一些隐藏的配置问题,我真的很想弄清楚。