如何编写python脚本来与shell脚本进行交互

时间:2016-10-25 07:34:16

标签: python shell subprocess nonblocking python-interactive

我在工作中遇到了问题。在这里。

我有几个脚本(主要是shell脚本)要执行,我想编写一个python脚本来自动运行它们。其中一个shell脚本在执行期间需要交互式输入。困扰我的是我找不到一种方法来读取它的输入提示,所以我无法决定继续输入什么。

我将问题简化为:

有一个名为mediator.py的脚本,里面运行greeter.shmediator获取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

我想按以下顺序执行此操作:

  1. 用户(就是我)运行mediator.py
  2. 内部mediator运行greeter.sh
  3. mediator 获取greeter 的输入提示,并将其输出到屏幕上。(此时,greeter正在等待对于用户的输入。这是我坚持的主要问题)
  4. 用户输入一个字符串(例如,'Mike'),mediator获取字符串'Mike'并将其传输到greeter
  5. greeter获取名称'Mike',并打印问候语
  6. mediator收到问候语,然后将其输出到屏幕上。
  7. 我搜索了一些解决方案并决定在Popen模块中使用subprocess函数,并将stdout子流程定向到PIPE,它是这样的:

    sb = subprocess.Popen(['sh', 'greeter.sh'], stdout = subprocess.PIPE, stdin = stdout, stderr = stdout)
    

    但我无法解决上面第3步中的主要问题。有人可以给我一些建议吗?非常感谢!

1 个答案:

答案 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()