Подтвердить что ты не робот

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

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

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

document.pdf:  table.tex
    pdflatex document.tex

table.tex:
    python table_generator.py

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

4b9b3361

Ответ 1

Что-то по этим строкам должно делать -

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

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

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

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

Ответ 2

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

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

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

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

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