2013-03-06 144 views
6

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

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

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

我能想到的下列可能性:

  • 使用subprocess.call("scons"...)我不知道如果接受scons的我需要通过命令行参数
  • 有python脚本的所有信息写入文件。让SConscript解析文件并获取通过的信息。

回答

2

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

一个选项考虑而不是使用命令行参数是使用SCONSFLAGS环境变量作为提到here。就个人而言,我不喜欢使用这个选项。

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

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

3

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

更简洁的解决方案是从SConscript文件调用脚本,这可能是预期的用法,应该会更容易。

+1

我直接调用一次'SCons.Script.main()',并认为它不值得。我打算在一个“子过程”中包装呼叫。调用()'调用和处理我的答案中提到的命令行参数。我想绕过实际的scons脚本可能会导致一个世界的伤害:) – Brady 2013-03-06 17:32:05

+0

我想这不能回答我的问题:如果我从SConscript调用我的Python脚本,如何将信息传递给它,我只是获得_before_调用scons? – 2013-03-07 09:52:25

+0

真的需要在scons之前调用脚本吗?您可以将脚本作为SConscript文件中的模块导入,然后根据需要执行,从用户那里收集必要的输入。尽管技术上不尽相同,但就用户而言并没有什么不同。如果这不是一个选项,那么Brandy提出的路线是一个可行的解决方案。 – 2013-03-07 11:25:41

1

感谢您的答案。我结束了使用这种方法:

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