2009-04-08 7 views
16

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

То, что я хочу достичь, по существу, что вы получите с этим Makefile:

document.pdf: table.tex 
    pdflatex document.tex 

table.tex: 
    python table_generator.py 

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

ответ

16

Что-то вдоль этих линий должны сделать -

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

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

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

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

4

В этом простом случае, самый простой способ это просто использовать подпроцесс модуля

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

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

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

Если вам действительно нужно только запускать эти команды, когда файлы были изменены, посмотрите раздел руководства SCons Writing Your Own Builders.

+3

Как это интегрируется с латексным сканером? Могу ли я еще иметь PDF (target = 'document.pdf', source = 'document.tex') в SConstruct? – saffsd