首页 > 解决方案 > 如何使用初始输入作为 SCons Phony 目标调用交互式 shell?

问题描述

在实现自定义 SCons 工具链时,我遇到了需要调用 shell 作为Phony目标并且已经提供初始输入的情况,因此我可以继续为已经调用的命令提供输入。

基本上,我想要的是声明具有所需行为的Phony目标:

# ...
def invoke_shell(target, source, env):
    initial_input = '...'
    # Some steps to interactive command with already provided initial_input

shell = env.Command(Alias('some-shell'), [],
    invoke_shell)
env.AlwaysBuild(shell)

我尝试的是编写以下SConstruct文件来覆盖没有初始输入的案例:

# ...
def invoke_yosys(target, source, env):
    return 'yosys'

yosys_shell = env.Command(Alias('yosys-shell'), [],
    invoke_yosys)
env.AlwaysBuild(yosys_shell)

所以当我调用时,scons -Q yosys-shell我应该得到 Yosys shell,但一般情况下它可以是任何交互式命令。我期望的是交互式调用shell,即我可以输入命令,而Yosys shell 将在提供输入的同时交互式地执行命令。但它不起作用。它立即退出,就像stdin映射到/dev/null.

标签: pythonsconsyosys

解决方案


您不想使用 Command() ,因为它被推迟到树遍历,您希望它在构建的其余部分之前立即运行,对吗?

您想在命令行上检测目标,然后使用 Execute() 或 os.system() 触发命令。

有关获取命令行目标的信息,请参见此处


推荐阅读