从Python脚本调用scons
我刚接触scons和Python。
我想知道有没有办法在Python脚本中调用scons。
我的Python脚本会接受用户输入的一些目录列表,这些目录里存放着需要一起编译的代码(除此之外,它还会做一些其他复杂的事情)。
它还会生成一个字符串,这个字符串将用作scons创建的可执行文件的名称。
我想把这些信息从我的Python脚本传递给scons,然后再调用scons。有没有简单的方法可以做到这一点呢?
我想到以下几种可能性:
- 使用
subprocess.call("scons"...)
,但我不确定scons是否接受我需要传递的所有信息作为命令行参数。 - 让Python脚本写入一个文件,然后让SConscript解析这个文件,获取传递的信息。
3 个回答
谢谢大家的回答。最后我用了这个方法:
这个Python脚本会把一些选项写进一个文本文件,然后关闭这个文件,再通过一个子进程调用 scons -f MySConscript_file
。SConstruct会从这个文本文件中读取值,放到一个列表里,然后使用这些值。
嗯,我想理论上这是可能的。scons
这个可执行文件其实就是一个Python脚本,它所做的就是在修改了sys.path
变量后执行SCons.Script.main()
。不过,如果你想让它做你想要的事情,可能得深入研究一下源代码。
一个更简单的方法是从SConscript文件中调用你的脚本,这可能是它的本来用法,而且应该会容易得多。
我用 subprocess.call()
这个 Python 函数来处理一些比较长和复杂的命令行参数,因为这是我正在做的项目所需要的。有些人认为调用应该更简单,这样就不需要封装这些参数,但那是另外一个话题 :)
除了使用命令行参数外,你还可以考虑使用 SCONSFLAGS
这个环境变量,具体可以参考 这里。不过我个人更倾向于不使用这个选项。
你需要的所有选项都可以通过命令行参数传入。一个很好的方法来定制和处理 SCons 的命令行参数是使用 SCons 的 AddOption() 函数。此外,你还可以通过 SCons 的 ARGUMENTS 字典 来获取简单的 variable=value
变量。其他相关的 SCons 命令行函数包括 GetOption() 和 SetOption()。
关于传入可执行文件名的字符串:SCons 可能不太喜欢这样做。至少要考虑一下,如果你第一次用一个特定的可执行文件名运行脚本,第二次用不同的名字运行,然后你想要清理,可能会留下可执行文件,因为 SCons 没有用相同的可执行文件名执行。