python - LD_LIBRARY_PATH 优先级和编译问题

标签 python linux r rpy2 installation

我正在尝试在 Linux 机器上安装一些软件(python 的 rpy2 包,特别是 rpy2.robjects,如果重要的话)。我需要该软件在我的本地空间中查找其共享库,而不是在/usr/lib64 之类的全局空间中。我在这台机器上没有管理员权限。我的问题是,即使我将 LD_LIBRARY_PATH 设置为指向我的本地空间,该软件仍然会转到/usr/lib64/whatever,它会在其中找到过时的库。这些库缺少一些它需要的对象,所以它失败了。什么可以优先于 LD_LIBRARY_PATH,有没有办法改变/摆脱它?谢谢。

顺便说一句,这个站点上的某个人在一年或更早之前有过类似的问题,但他的回答涉及环境变量 RPATH,并使用 chrpath 实用程序更改它。我根本不清楚 rpy2 正在使用 RPATH,而且 chrpath 在我的系统上似乎不可用。

附录:我尝试使用 LD_DEBUG=libs 运行。得到很多输出,看起来系统正在我的 LD_LIBRARY_PATH 中寻找库并找到它们。问题似乎从这里开始:

/usr/local/lib64/R/library/methods/libs/methods.so: error: symbol lookup error:
undefined symbol: Rf_allocS4Object (fatal)
Error in dyn.load(file, DLLpath = DLLpath, ...) : 
unable to load shared object '/usr/local/lib64/R/library/methods/libs/methods.so':
/usr/local/lib64/R/library/methods/libs/methods.so: undefined symbol: Rf_allocS4Object

所以我的猜测是问题在于 DLLpath 中的任何内容都覆盖了 LD_LIBRARY_PATH。我试图通过将目录添加到 os.environ['PATH'] 来更改此设置,但没有这样做。显然没有“DLLPATH”,正如我认为的那样。

好的,我想这就是进步。还有其他人吗?谢谢。

最佳答案

查看名为 $R_HOME/etc/ldpaths 的文件(在您的情况下 $R_HOME 似乎是/usr/local/lib64/R)。正是这个文件中的命令在 R 的启动时设置了 LD_LIBRARY_PATH

我的看起来像这样:

flodel@netbook-samsung-N150:~$ cat /usr/lib/R/etc/ldpaths 
: ${JAVA_HOME=/usr/lib/jvm/java-6-openjdk/jre}
: ${R_JAVA_LD_LIBRARY_PATH=${JAVA_HOME}/lib/i386/client:${JAVA_HOME}/lib/i386:/usr/lib/jni}
if test -n ""; then
: ${R_LD_LIBRARY_PATH=${R_HOME}/lib:}
else
: ${R_LD_LIBRARY_PATH=${R_HOME}/lib}
fi
if test -n "${R_JAVA_LD_LIBRARY_PATH}"; then
  R_LD_LIBRARY_PATH="${R_LD_LIBRARY_PATH}:${R_JAVA_LD_LIBRARY_PATH}"
fi
if test -z "${LD_LIBRARY_PATH}"; then
  LD_LIBRARY_PATH="${R_LD_LIBRARY_PATH}"
else
  LD_LIBRARY_PATH="${R_LD_LIBRARY_PATH}:${LD_LIBRARY_PATH}"
fi
export LD_LIBRARY_PATH

如果您没有文件的写权限,您仍然可以在启动 R 之前执行此操作:

export R_LD_LIBRARY_PATH=/your/custom/path

我通过在 R 启动后运行以下命令在我的机器上测试它可以工作:

Sys.getenv("LD_LIBRARY_PATH")
#[1] "/your/custom/path:/usr/lib/jvm/java-6-openjdk/jre/lib/i386/client:/usr/lib/jvm/java-6-openjdk/jre/lib/i386:/usr/lib/jni"

关于python - LD_LIBRARY_PATH 优先级和编译问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11658687/

相关文章:

python - Linux通过弹出密码获取root权限

python - 如何隐藏 python 命令提示符窗口

r - R 的 ccf 和 Julia 的 crosscor 中使用的方程是什么?

python - Django 上传文件

python - 为什么我这次采访的算法不是最佳方法?

python - 如何使用 Python 读取文件功能?

r - 运行时-使用Apply函数

javascript - 如何格式化 Shiny updated numericInput 的输入但不更改实际值?

python - 从响应中获取选定的路径

python - 如何将 python 集转换为 numpy 数组?