代码之家  ›  专栏  ›  技术社区  ›  saffsd

如何让scon调用外部脚本?

  •  16
  • saffsd  · 技术社区  · 15 年前

    我想用烤饼做一份乳胶文件。特别是,我想让scons调用一个python程序,该程序生成一个文件,其中包含一个在主文档中\输入的表。我已经查阅了scons文档,但是我还不清楚我需要做什么。

    我希望实现的基本上是您将从这个makefile中得到的:

    document.pdf:  table.tex
        pdflatex document.tex
    
    table.tex:
        python table_generator.py
    

    我怎么用烤饼来表达这个?

    2 回复  |  直到 15 年前
        1
  •  16
  •   Hexagon    15 年前

    沿着这些线应该做些什么-

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

    它声明通过调用python脚本生成“document.tex”,并请求从此生成的“document.tex”文件创建PDF文档。

    请注意,这只是精神上的。这可能需要一些调整。尤其是,我不确定您希望生成“document.tex”时使用哪种语义——应该每次都生成它吗?只有当它不存在的时候?其他文件何时更改?(您希望将此依赖项作为第二个参数添加到command()中,在这种情况下)。

    此外,如果需要,可以将command()的输出用作pdf()的输入。为了清楚起见,我没有这么做。

        2
  •  4
  •   Eli Courtwright    15 年前

    在这个简单的例子中,最简单的方法是只使用子流程模块

    from subprocess import call
    call("python table_generator.py")
    call("pdflatex document.tex")
    

    无论sconstruct文件中的位置如何,这些行都将发生在scons执行的任何编译和链接之前。

    缺点是,这些命令将在每次运行scon时执行,而不是只在文件发生更改时执行,这就是示例makefile中会发生的情况。因此,如果这些命令需要很长时间才能运行,这将不是一个好的解决方案。

    如果您真的只需要在文件更改时运行这些命令,请查看scons手册部分 Writing Your Own Builders .