8

我是 scons 和 Python 的新手。我想知道是否有办法从 python 脚本中调用 scons。

我的 python 脚本从用户那里接受要一起编译的代码所在的目录列表(除了做一些其他不平凡的事情)。它还生成一个字符串,用作 scons 创建的可执行文件的名称。

我想将此信息从我的 python 脚本传递给 scons,然后调用 scons。有没有一种简单的方法可以做到这一点?

我可以想到以下几种可能性:

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

3 回答 3

3

嗯,我想理论上是可以的。scons可执行文件本身只是一个 python 脚本,它所做的只是在SCons.Script.main()修改sys.path变量后执行。但是你可能必须开始深入挖掘源代码才能真正理解如何让它做你想做的事情。

一个更简洁的解决方案是从 SConscript 文件中调用您的脚本,这可能是预期的用途,并且应该更容易。

于 2013-03-06T16:17:08.997 回答
2

我已经使用subprocess.call()python 函数来封装我正在处理的特定项目所需的有点长且复杂的命令行参数。有些人认为调用应该更简单,以便不需要封装它,但这是一个不同的主题:)

除了使用命令行参数之外,要考虑的一种选择是使用这里SCONSFLAGS提到的环境变量。就个人而言,我不喜欢使用这个选项。

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

关于传递可执行文件名称的字符串:SCons 可能不喜欢这样。至少,考虑一下您使用特定的可执行字符串执行脚本一次,然后使用不同的字符串执行第二次,然后您想要清理,如果 SCons 没有使用相同的可执行文件名称执行,您最终可能会留下可执行文件。

于 2013-03-06T17:10:33.123 回答
1

感谢您的回答。我最终使用了这种方法:

python 脚本将选项列表写入文本文件,将其关闭,然后scons -f MySConscript_file使用子进程调用进行调用。SConstruct 将文本文件中的值读取到列表中,并使用它们。

于 2013-03-07T13:02:40.740 回答