捆绑pdflatex以在具有自定义AMI映像的AWS Lambda上运行

问题描述 投票:2回答:2

我的目标是创建一个Amazon Lambda函数,通过python使用pdflatex工具将.tex文件编译成.pdf。

我使用亚马逊的AMI构建了一个EC2实例,并使用yum安装了pdflatex:

yum install texlive-collection-latex.noarch

这样,我可以使用pdflatex和我的python代码工作,将我的.tex编译成.pdf,就像我想要的那样。

现在,我需要创建一个包含pdflatex工具的.zip文件包; latexcodec(我用过的python库,没问题);和我的python文件:handler(lambda函数处理程序)和worker(编译我的.tex文件)。

此捆绑包是将我的代码和库上载到Amazon Lambda所需的部署包。

问题是:pdflatex有很多依赖项,我必须在一个地方收集所有内容。我找到了一个脚本,它为我做了这个:

http://www.metashock.de/2012/11/export-binary-with-lib-dependencies/

我已经设置了PATH以在新目录中找到pdflatex二进制文件,因此我可以使用它并且我遇到了一个问题:pdflatex找不到某些依赖项。我能够通过将环境变量设置为脚本将所有内容移动到的文件夹来修复它:

export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/home/ec2-user/lambda/local/lib64:/home/ec2-user/lambda/local/usr/lib64"

此时,我通过bash直接运行pdflatex。但是我的python脚本在尝试使用pdflatex时发出错误:

mktexfmt: No such file or directory
I can't find the format file `pdflatex.fmt'!

我还能够通过将pdflatex.fmttexmf.cnf文件移动到我的bundle文件夹并设置一些环境变量来解决这个问题:

export TEXFORMATS=/home/ec2-user/lambda/local/usr/bin

现在,我目前的问题,python脚本不断抛出以下错误:

---! /home/ec2-user/lambda/local/usr/bin/pdflatex.fmt doesn't match pdftex.pool
(Fatal format file error; I'm stymied)

我找到了一些可能的解决方案;删除.texmf-var文件夹,在我的情况下,不存在;使用fmtutil,我在AMI图像中没有...

1 - 我是否遗漏了任何环境变量?

2 - 或者以错误的方式移动我的pdflatex二进制文件及其所有依赖项?

3 - 是否有任何正确的方法来移动二进制及其所有依赖项,以便可以在其他机器中使用(考虑env变量)?

python lambda pdflatex
2个回答
1
投票

Lambda环境是一个容器,而不是常见的EC2实例。 .zip中的所有文件都部署在容器内的/var/task/中。顺便说一下,除了目录/tmp之外,所有内容都以只读方式挂载。因此,例如,运行yum是不可能的。

对于你的情况,我建议你把二进制文件放在你的zip中并在/var/task/<binary name>中调用它。记得把一个静态编译的二进制文件放在与容器内核兼容的linux中。


0
投票

samoconnor在https://github.com/samoconnor/lambdalatex做的正是你想要的。请注意,他在其处理程序function中设置了环境变量

os.environ['PATH'] += ":/var/task/texlive/2017/bin/x86_64-linux/"
os.environ['HOME'] = "/tmp/latex/"
os.environ['PERL5LIB'] = "/var/task/texlive/2017/tlpkg/TeXLive/"

这对你来说也许可以解决问题。

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