如何让scons调用外部脚本?

16

我试图使用scons构建LaTeX文档。特别地,我希望scons调用一个生成包含表格的文件的Python程序,该表格作为\input{}插入到主文档中。我已经查看了scons文档,但并不立即清楚我需要做什么。

我的目标实际上是通过这个Makefile来实现的:

document.pdf:  table.tex
    pdflatex document.tex

table.tex:
    python table_generator.py

我怎样在scons中表达这个呢?

2个回答

16

这样的代码应该可以解决问题:

env.Command ('document.tex', '', 'python table_generator.py')
env.PDF ('document.pdf', 'document.tex')

这段代码声明 'document.tex' 是通过调用 Python 脚本生成的,并请求从生成的 'document.tex' 文件创建一个 PDF 文档。

请注意,这只是精神上的。它可能需要一些微调。特别是,我不确定您希望对 'document.tex' 的生成具有什么样的语义 - 它应该每次都生成吗?仅在不存在时生成?当某个其他文件更改时?(在这种情况下,您需要将此依赖项添加为 Command() 的第二个参数)。

此外,如果需要,可以使用 Command() 的输出作为 PDF() 的输入。出于清晰起见,我没有这样做。


调用“python”的问题在于,在某些系统上它被称为“python3”。 - Piotr Siupa

3
在这种简单情况下,最简单的方法就是使用子进程模块。
from subprocess import call
call("python table_generator.py")
call("pdflatex document.tex")

无论这些行在SConstruct文件中的位置如何,它们都会在SCons执行任何编译和链接之前发生。
缺点是每次运行SCons时都会执行这些命令,而不仅仅是在文件更改时才执行,这与您的示例Makefile中发生的情况不同。因此,如果这些命令需要很长时间才能运行,则这不是一个好的解决方案。
如果您确实需要仅在文件更改时运行这些命令,请查看SCons手册中的编写自己的构建器部分。

3
这如何与latex扫描器集成?我是否仍然可以在SConstruct中使用PDF(target='document.pdf', source='document.tex')? - saffsd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接