从Python脚本调用scons

8
我刚接触Scons和Python。我想知道是否有一种方法可以在Python脚本中调用Scons。
我的Python脚本从用户那里接受一个目录列表,其中包含要编译的代码(以及其他一些非平凡的任务)。它还生成一个字符串,该字符串将用作Scons创建的可执行文件的名称。
我想从我的Python脚本传递此信息给Scons,然后调用Scons。是否有简单的方法来实现这一点?
我能想到以下可能性:
- 使用subprocess.call(“scons”…)将不确定scons是否接受我需要传递的所有信息作为命令行参数。 - 让Python脚本写入文件。让SConscript解析文件并获取传递的信息。
3个回答

3

理论上讲,这是有可能的。 scons 可执行文件本身只是一个 Python 脚本,它所做的就是在修改 sys.path 变量后执行 SCons.Script.main()。但你可能需要深入挖掘源代码,才能真正理解如何使其按照你的意愿运行。

更为简洁的解决方案是从 SConscript 文件中调用你的脚本,这可能是预期的用法,并且应该更容易实现。


1
我曾经考虑过直接调用 SCons.Script.main(),但最终决定不这样做。我选择在 subprocess.call() 调用中包装该调用,并按照我的答案中提到的处理命令行参数。我认为试图绕过实际的 Scons 脚本可能会导致一系列问题 :) - Brady
我猜这并不能回答我的问题:如果我从SConscript调用我的Python脚本,那么在调用scons之前如何将刚刚获取的信息传递给它? - Neha Karanjkar
有必要在scons之前调用您的脚本吗?您可以从SConscript文件中将您的脚本作为模块导入,然后根据需要执行,并从用户那里收集必要的输入。虽然从技术上讲不完全相同,但对于用户来说并没有区别。如果这不是一个选项,那么Brandy提出的方法是可行的解决方案。 - none_00

2
我使用了subprocess.call() python函数来封装在我正在处理的特定项目中需要的有点长且复杂的命令行参数。有人争辩说调用应该更简单,以免需要封装它,但这是另一个话题 :)

考虑使用代替使用命令行参数的选项SCONSFLAGS环境变量,如这里所提到的。个人而言,我更喜欢不使用此选项。

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

关于传递可执行文件名称的问题:SCons可能不喜欢这样做。至少要考虑一下,如果您首先使用特定的可执行字符串执行脚本,然后再使用另一个可执行字符串执行脚本,然后想要清理,如果没有使用相同的可执行文件名来执行SCons,则可能会留下可执行文件。


1
感谢您的回答。最终我使用了以下方法:
Python脚本将选项列表写入文本文件,关闭文件,并使用子进程调用scons -f MySConscript_file。SConstruct从文本文件中读取值到列表中,并使用它们。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接