从Python脚本调用scons

8 投票
3 回答
3049 浏览
提问于 2025-04-17 18:08

我刚接触scons和Python。

我想知道有没有办法在Python脚本中调用scons。

我的Python脚本会接受用户输入的一些目录列表,这些目录里存放着需要一起编译的代码(除此之外,它还会做一些其他复杂的事情)。

它还会生成一个字符串,这个字符串将用作scons创建的可执行文件的名称。

我想把这些信息从我的Python脚本传递给scons,然后再调用scons。有没有简单的方法可以做到这一点呢?

我想到以下几种可能性:

  • 使用 subprocess.call("scons"...),但我不确定scons是否接受我需要传递的所有信息作为命令行参数。
  • 让Python脚本写入一个文件,然后让SConscript解析这个文件,获取传递的信息。

3 个回答

1

谢谢大家的回答。最后我用了这个方法:

这个Python脚本会把一些选项写进一个文本文件,然后关闭这个文件,再通过一个子进程调用 scons -f MySConscript_file。SConstruct会从这个文本文件中读取值,放到一个列表里,然后使用这些值。

3

嗯,我想理论上这是可能的。scons这个可执行文件其实就是一个Python脚本,它所做的就是在修改了sys.path变量后执行SCons.Script.main()。不过,如果你想让它做你想要的事情,可能得深入研究一下源代码。

一个更简单的方法是从SConscript文件中调用你的脚本,这可能是它的本来用法,而且应该会容易得多。

2

我用 subprocess.call() 这个 Python 函数来处理一些比较长和复杂的命令行参数,因为这是我正在做的项目所需要的。有些人认为调用应该更简单,这样就不需要封装这些参数,但那是另外一个话题 :)

除了使用命令行参数外,你还可以考虑使用 SCONSFLAGS 这个环境变量,具体可以参考 这里。不过我个人更倾向于不使用这个选项。

你需要的所有选项都可以通过命令行参数传入。一个很好的方法来定制和处理 SCons 的命令行参数是使用 SCons 的 AddOption() 函数。此外,你还可以通过 SCons 的 ARGUMENTS 字典 来获取简单的 variable=value 变量。其他相关的 SCons 命令行函数包括 GetOption()SetOption()

关于传入可执行文件名的字符串:SCons 可能不太喜欢这样做。至少要考虑一下,如果你第一次用一个特定的可执行文件名运行脚本,第二次用不同的名字运行,然后你想要清理,可能会留下可执行文件,因为 SCons 没有用相同的可执行文件名执行。

撰写回答