当从R调用时,Libreoffice给出“应用程序错误”

前端之家收集整理的这篇文章主要介绍了当从R调用时,Libreoffice给出“应用程序错误”前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

在docker容器内我试图使用LibreOffice将XLSX文件转换为PDF.相关命令在命令行上工作但在从R调用时失败并显示“Application Error”.我使用这个Dockerfile添加一些(根据我的经验任意)XLSX文件

@H_404_5@FROM rocker/r-ver:3.4.3 RUN apt-get update \ && apt-get install --yes --no-install-recommends \ default-jre-headless libreoffice-calc \ && apt-get clean \ && rm -rf /var/lib/apt/lists/* \ && echo /usr/lib/libreoffice/program > /etc/ld.so.conf.d/libreoffice.conf \ && ldconfig COPY foo.xlsx /tmp

(ldconfig的技巧来自于
shared library issue with the system function in R.)

在命令行上,我可以将XLSX文件转换为PDF:

@H_404_5@root@b395caeba33b:/# loffice --headless --convert-to pdf /tmp/foo.xlsx convert /tmp/foo.xlsx -> //foo.pdf using filter : calc_pdf_Export

但是,这从R失败:

@H_404_5@> system("loffice --version") LibreOffice 5.2.7.2 20m0(Build:2) > system("loffice --headless --convert-to pdf /tmp/foo.xlsx") convert /tmp/foo.xlsx -> //foo.pdf using filter : calc_pdf_Export Application Error

如果我将基本图像从rocker / r-ver:3.4.3更改为使用R 3.4.4和Debian testing / sid的rocker / r-base,结果只会略有变化:

@H_404_5@> system("loffice --version") LibreOffice 6.0.2.1.0 00m0(Build:1) > system("loffice --headless --convert-to pdf /tmp/foo.xlsx") Application Error

当从R调用时,如何让LibreOffice将XLSX文件转换为PDF?

最佳答案
我找到了一个解决方法,但我仍然对正确的解释感兴趣.这是我发现的:

>使用选项–security-opt seccomp启动docker容器:unconfined并安装strace.
>在R电话中

@H_404_5@system("strace -f -o R.trace loffice --headless --convert-to pdf /tmp/foo.xlsx")

>生成的跟踪文件显示加载libsal_textenclo.so时出错.奇怪的是它在/usr/lib / x86_64-linux-gnu中搜索库,即使ldconfig知道在哪里找到它:

@H_404_5@root@1519f52c05e0:/# grep libsal R.trace 257 open("/usr/lib/x86_64-linux-gnu/libsal_textenclo.so",O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) root@1519f52c05e0:/# ldconfig -p | grep libsal libsal_textenclo.so (libc6,x86-64) => /usr/lib/libreoffice/program/libsal_textenclo.so

>将LD_LIBRARY_PATH设置为包含/usr/lib / libreoffice / program并不能解决问题.

@H_404_5@root@4a235dfa08e3:~# export LD_LIBRARY_PATH=/usr/lib/libreoffice/program root@4a235dfa08e3:~# Rscript -e 'system("loffice --headless --convert-to pdf /tmp/foo.xlsx")' Application Error

>我当前的解决方法是在R会话中设置LD_LIBRARY_PATH:

@H_404_5@> Sys.setenv(LD_LIBRARY_PATH="/usr/lib/libreoffice/program") > system("loffice --headless --convert-to pdf /tmp/foo.xlsx") convert /tmp/foo.xlsx -> //foo.pdf using filter : calc_pdf_Export Overwriting: //foo.pdf

猜你在找的Docker相关文章