【问题标题】:Invoking scons from a Python script从 Python 脚本调用 scons
【发布时间】:2013-03-06 14:53:26
【问题描述】:

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

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

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

我能想到以下几种可能:

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

【问题讨论】:

    标签: python scons


    【解决方案1】:

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

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

    【讨论】:

    • 我曾考虑直接致电SCons.Script.main() 一次,并认为这不值得。我将调用包装在subprocess.call() 调用中,并按照我的回答中提到的那样处理命令行参数。我认为试图绕过实际的 scons 脚本可能会导致世界受到伤害:)
    • 我想这不能回答我的问题:如果我从 SConscript 调用我的 Python 脚本,我如何将我刚刚获得的信息传递给它在调用 scons 之前 ?
    • 真的需要在 scons 之前调用你的脚本吗?您可以将脚本作为模块从 SConscript 文件导入,然后根据需要执行,从用户那里收集必要的输入。虽然技术上不一样,但就用户而言没有区别。如果这不是一个选项,那么布兰迪提出的路线是一个可行的解决方案。
    【解决方案2】:

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

    要考虑使用SCONSFLAGS 环境变量(如here 所述)而不是使用命令行参数。就个人而言,我不喜欢使用这个选项。

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2014-05-14
        • 1970-01-01
        • 2010-10-18
        • 1970-01-01
        • 1970-01-01
        • 2014-06-25
        • 2010-11-07
        • 2018-03-25
        • 2021-10-19
        相关资源
        最近更新 更多