Как заставить scons вызывать внешний скрипт?

Я пытаюсь использовать scons для создания латексного документа. В частности, я хочу, чтобы scons вызывал программу на Python, которая генерирует файл, содержащий таблицу, которая \input{} входит в основной документ. Я просмотрел документацию scons, но мне не сразу понятно, что мне нужно делать.

Чего я хочу добиться, так это того, что вы получите с этим make-файлом:

document.pdf:  table.tex
    pdflatex document.tex

table.tex:
    python table_generator.py

Как я могу выразить это в scons?


person saffsd    schedule 08.04.2009    source источник


Ответы (2)


Что-то в этом роде должно делать -

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

Он объявляет, что «document.tex» создается путем вызова скрипта Python, и запрашивает создание PDF-документа из этого сгенерированного файла «document.tex».

Обратите внимание, что это только в духе. Это может потребовать некоторой настройки. В частности, я не уверен, какую семантику вы хотели бы использовать для генерации «document.tex» — она должна генерироваться каждый раз? Только когда его нет? Когда какой-то другой файл изменяется? (в этом случае вы захотите добавить эту зависимость в качестве второго аргумента Command()).

Кроме того, выходные данные Command() можно использовать в качестве входных данных для PDF(), если это необходимо. Для ясности я этого не делал.

person Hexagon    schedule 08.04.2009

В этом простом случае проще всего просто использовать модуль подпроцесса

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

Независимо от того, где в вашем файле SConstruct находятся эти строки, они произойдут до любой компиляции и компоновки, выполняемой SCons.

Недостатком является то, что эти команды будут выполняться каждый раз, когда вы запускаете SCons, а не только при изменении файлов, как это произошло бы в вашем примере Makefile. Поэтому, если эти команды выполняются долго, это не будет хорошим решением.

Если вам действительно нужно запускать эти команды только после изменения файлов, обратитесь к разделу руководства SCons Написание собственных сборщиков.

person Eli Courtwright    schedule 08.04.2009
comment
Как это интегрируется с латексным сканером? Могу ли я по-прежнему использовать PDF(target='document.pdf', source='document.tex') в SConstruct? - person saffsd; 08.04.2009