首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Libreoffice在从R调用时出现"Application Error“

Libreoffice在从R调用时出现"Application Error“
EN

Stack Overflow用户
提问于 2018-03-16 18:42:13
回答 2查看 792关注 0票数 9

在一个docker容器内,我正在尝试使用LibreOffice将XLSX文件转换为PDF。相关命令在命令行上有效,但在从R调用时失败,出现“应用程序错误”。我使用这个Dockerfile,它添加了一些(在我的经验中是任意的) XLSX文件:

代码语言:javascript
复制
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:

代码语言:javascript
复制
root@b395caeba33b:/# loffice --headless --convert-to pdf /tmp/foo.xlsx 
convert /tmp/foo.xlsx -> //foo.pdf using filter : calc_pdf_Export

但是,这在R:

代码语言:javascript
复制
> 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,结果只会有轻微的变化:

代码语言:javascript
复制
> 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?

EN

回答 2

Stack Overflow用户

发布于 2018-04-18 16:58:34

该问题是由于环境差异而发生的。通过system运行env命令时

代码语言:javascript
复制
> system('env')
R_UNZIPCMD=/usr/bin/unzip
HOSTNAME=da4d504ddcb1
LD_LIBRARY_PATH=/usr/local/lib/R/lib:/usr/local/lib:/usr/lib/x86_64-linux-gnu:/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/amd64/server
SHLVL=0
HOME=/root
R_LIBS_SITE=
R_BROWSER=xdg-open
PAGER=/usr/bin/pager
R_VERSION=3.4.3
BUILD_DATE=
R_SYSTEM_ABI=linux,gcc,gxx,gfortran,?
TAR=/bin/tar
R_LIBS_USER=/usr/local/lib/R/site-library
TERM=xterm
COLUMNS=200
R_ARCH=
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
R_BZIPCMD=/bin/bzip2
R_INCLUDE_DIR=/usr/local/lib/R/include
R_SESSION_TMPDIR=/tmp/RtmpJsaXba
LANG=en_US.UTF-8
R_GZIPCMD=/bin/gzip
SED=/bin/sed
LN_S=ln -s
R_PDFVIEWER=/usr/bin/xdg-open
R_TEXI2DVICMD=/usr/bin/texi2dvi
R_HOME=/usr/local/lib/R
R_PRINTCMD=/usr/bin/lpr
R_DOC_DIR=/usr/local/lib/R/doc
R_LIBS=/usr/local/lib/R/site-library:/usr/local/lib/R/library:/usr/lib/R/library
LC_ALL=en_US.UTF-8
R_SHARE_DIR=/usr/local/lib/R/share
PWD=/
R_ZIPCMD=/usr/bin/zip
R_PLATFORM=x86_64-pc-linux-gnu
R_PAPERSIZE=letter
LINES=50
MAKE=make
R_RD4PDF=times,inconsolata,hyper
EDITOR=vi

您可以看到默认的R有一组环境变量,其中一个是LD_LIBRARY_PATH

代码语言:javascript
复制
> system('loffice --headless --convert-to pdf /tmp/foo.xlsx')
Application Error
> system('LD_LIBRARY_PATH= loffice --headless --convert-to pdf /tmp/foo.xlsx')
convert /tmp/foo.xlsx -> //foo.pdf using filter : calc_pdf_Export

清除它,它就能正常工作。它在bash中工作的原因是因为缺省环境变量集很小

代码语言:javascript
复制
root@5c5bbcfcebf2:/# env
LC_ALL=en_US.UTF-8
LANG=en_US.UTF-8
HOSTNAME=5c5bbcfcebf2
PWD=/
HOME=/root
R_VERSION=3.4.3
BUILD_DATE=
TERM=xterm
SHLVL=1
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
_=/usr/bin/env

同样,当您从bash启动r而不是R

代码语言:javascript
复制
root@5c5bbcfcebf2:/# r -i
system('env')
R_UNZIPCMD=/usr/bin/unzip
HOSTNAME=5c5bbcfcebf2
SHLVL=1
R_INSTALL_PKG=littler
HOME=/root
R_ENVIRON=
R_LIBS_SITE=
R_BROWSER=xdg-open
PAGER=/usr/bin/pager
R_VERSION=3.4.3
BUILD_DATE=
R_SYSTEM_ABI=linux,gcc,gxx,gfortran,?
R_PROFILE_USER=
TAR=/bin/tar
_=/usr/local/bin/r
R_LIBS_USER=/usr/local/lib/R/site-library
TERM=xterm
R_ARCH=
R_PAPERSIZE_USER=letter
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
R_BZIPCMD=/bin/bzip2
R_INCLUDE_DIR=/usr/local/lib/R/include
R_SESSION_TMPDIR=/tmp
R_OSTYPE=unix
LANG=en_US.UTF-8
R_CMD=/usr/local/lib/R/bin/Rcmd
R_DEFAULT_PACKAGES=NULL
R_PACKAGE_NAME=littler
R_GZIPCMD=/bin/gzip
LN_S=ln -s
SED=/bin/sed
R_PDFVIEWER=/usr/bin/xdg-open
R_PROFILE=
R_ENVIRON_USER=
R_TEXI2DVICMD=/usr/bin/texi2dvi
R_HOME=/usr/local/lib/R
R_PRINTCMD=/usr/bin/lpr
R_DOC_DIR=/usr/local/lib/R/doc
R_LIBS=/usr/local/lib/R/site-library:/usr/local/lib/R/library:/usr/lib/R/library
LC_ALL=en_US.UTF-8
PWD=/
R_SHARE_DIR=/usr/local/lib/R/share
R_ZIPCMD=/usr/bin/zip
R_PAPERSIZE=letter
R_PLATFORM=x86_64-pc-linux-gnu
MAKE=make
R_RD4PDF=times,inconsolata,hyper
EDITOR=vi

在使用r -i从bash启动的交互式外壳中

代码语言:javascript
复制
system('LD_LIBRARY_PATH= loffice --headless --convert-to pdf /tmp/foo.xlsx')
convert /tmp/foo.xlsx -> //foo.pdf using filter : calc_pdf_Export

system('loffice --headless --convert-to pdf /tmp/foo.xlsx')
convert /tmp/foo.xlsx -> //foo.pdf using filter : calc_pdf_Export
Overwriting: //foo.pdf

正是从父进程继承的子进程环境导致了您的问题

票数 2
EN

Stack Overflow用户

发布于 2018-03-19 18:17:52

我已经找到了一种解决方法,但我仍然对适当的解释感兴趣。这是我发现的:

使用option --security-opt seccomp:unconfined启动docker容器并安装strace.

  • Within R call

system("strace -f -o R.trace loffice --headless --convert-to pdf libsal_textenclo.so生成的跟踪文件显示加载libsal_textenclo.so时出错。奇怪的是,尽管ldconfig知道在哪里可以找到这个库,但它仍然在/usr/lib/x86_64-linux-gnu中搜索库:

root@1519f52c05e0:/# grep libsal R.trace 257 open("/usr/lib/x86_64-linux-gnu/libsal_textenclo.so",O_RDONLY|O_CLOEXEC) = -1 ENOENT (无此类文件或目录) root@1519f52c05e0:/# ldconfig -p | grep libsal libsal_textenclo.so (libc6,x86-64) => LD_LIBRARY_PATH to include /usr/lib/libreoffice/program not解决了此问题。

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 session:Sys.setenv(LD_LIBRARY_PATH="/usr/lib/libreoffice/program") > system("loffice --headless --convert-to pdf /tmp/foo.xlsx")转换/tmp/foo.xlsx中设置LD_LIBRARY_PATH使用过滤器覆盖-> //foo.pdf : calc_pdf_Export覆盖: //foo.pdf
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49318776

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档