我在工作中遇到了问题。在这里。
我有几个脚本(主要是shell脚本)要执行,我想编写一个python脚本来自动运行它们。其中一个shell脚本在执行期间需要交互式输入。困扰我的是我找不到一种方法来读取它的输入提示,所以我无法决定继续输入什么。
我将问题简化为:
有一个名为mediator.py
的脚本,里面运行greeter.sh
。 mediator
获取greeter
的输入提示并将其打印给用户,然后获取用户的输入并将其传递给greeter
。从用户的角度来看,mediator
需要与greeter
完全相同。
以下是greeter.sh
:
#! /bin/bash
echo "Please enter your name: " # <- I want 'mediator.py' to read this prompt and show it to me, and then get what I input, then pass my input to 'greeter.sh'
read name
echo "Hello, " $name
我想按以下顺序执行此操作:
mediator.py
mediator
运行greeter.sh
mediator
获取greeter
的输入提示,并将其输出到屏幕上。(此时,greeter
正在等待对于用户的输入。这是我坚持的主要问题) mediator
获取字符串'Mike'并将其传输到greeter
greeter
获取名称'Mike',并打印问候语mediator
收到问候语,然后将其输出到屏幕上。我搜索了一些解决方案并决定在Popen
模块中使用subprocess
函数,并将stdout
子流程定向到PIPE
,它是这样的:
sb = subprocess.Popen(['sh', 'greeter.sh'], stdout = subprocess.PIPE, stdin = stdout, stderr = stdout)
但我无法解决上面第3步中的主要问题。有人可以给我一些建议吗?非常感谢!
答案 0 :(得分:0)
你使它变得比它必须更加复杂(和脆弱)。而不是在顶层编写所有内容并尝试使用子进程或其他任何东西来使用脚本,就好像它们在函数中一样,只需编写模块和函数并在主脚本中使用它们。
以下是脚本本身包含所有内容的示例,但如果需要在不同脚本之间共享某些功能,则可以将其拆分为不同的模块
# main.py
def ask_name():
return raw_input("Please enter your name: ")
def greet(name):
return "Hello, {} name !\n".format(name)
def main():
name = ask_name()
print greet(name)
if __name__ == "__main__":
main()