gpt4 book ai didi

scons:如何处理动态目标?

转载 作者:行者123 更新时间:2023-12-04 02:32:09 24 4
gpt4 key购买 nike

我正在尝试自动化转换 PDF 的工作至 png文件 scons .我转换使用的工具是convert来自 ImageMagick .

这是原始命令行:

  1. convert input.pdf temp/temp.png
  2. convert temp/*.png -append output.png

第一条命令将为 PDF 文件中的每一页生成一个 PNG 文件,因此第一条命令的目标是一个动态文件列表。

这是 SConstruct我正在处理的文件:

convert = Builder(action=[
Delete("${TARGET.dir}"),
Mkdir("${TARGET.dir}"),
"convert $SOURCE $TARGET"])
combine = Builder(action="convert $SOURCE -append $TARGET")

env = Environment(BUILDERS={"Convert": convert, "Combine": combine})

pdf = env.PDF("input.tex")
pngs = env.Convert("temp/temp.png", pdf) # I don't know how to specify target in this line
png = env.Combine('output.png', pngs)
Default(png)

代码pngs = env.Convert("temp/temp.png", pdf)实际上是错误的,因为目标是多个文件,我不知道之前有多少env.Convert被执行,所以最后的 output.png仅包含 PDF 文件的第一页。

感谢任何提示。

更新:

我刚刚发现我可以使用命令 convert input.pdf -append output.png避免两步转换。

我仍然很好奇当中间临时文件列表事先未知并且需要动态目标列表时如何处理这种情况。

最佳答案

如果您想知道如何处理您提出的原始(转换和合并)情况,我建议您创建一个带有 SCons Emitter 的构建器.发射器允许您修改源文件和目标文件的列表。这对于干净构建中不存在的生成文件非常有效。

如您所述,转换步骤将生成多个目标,诀窍是您需要能够根据源“计算”发射器中的那些目标。例如,最近我创建了一个 wsdl2java 构建器,并能够在发射器中进行一些简单的 wsdl 解析,以计算要生成的所有目标 java 文件(源是 wsdl)。

以下是构建脚本的大致思路:

def convert_emitter(source, target, env):
# both and source and target will be a list of nodes
# in this case, the target will be empty, and you need
# to calculate all of the generated targets based on the
# source pdf file. You will need to open the source file
# with standard python code. All of the targets will be
# removed when cleaned (scons -c)
target = [] # fill in accordingly
return (target, source)

# Optionally, you could supply a function for the action
# which would have the same signature as the emitter
convert = env.Builder(emitter=convert_emitter,
action=[
Delete("temp"),
Mkdir("temp"),
"convert $SOURCE $TARGET"])
env.Append(BUILDERS={'Convert' : convert})

combine = env.Builder(action=convert_action, emitter=combine_emitter)
env.Append(BUILDERS={'Combine' : combine})

pdf = env.PDF('input.tex')
# You can omit the target in this call, as it will be filled-in by the emitter
pngs = env.Convert(source=pdf)
png = env.Combine(target='output.png', source=pngs)

关于scons:如何处理动态目标?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21397676/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com