在python中执行Interactive shell脚本

时间:2016-10-05 10:55:43

标签: python python-2.7 shell python-3.x

我有一个shell脚本,询问用户输入。考虑以下示例

Test.sh

#!/bin/bash
echo -n "Enter name > "
read text
echo "You entered: $text"
echo -n "Enter age > "
read text
echo "You entered: $text"
echo -n "Enter location > "
read text
echo "You entered: $text"

脚本执行:

sh test.sh
Enter name> abc
You entered: abc
Enter age > 35
You entered: 35
Enter location > prop
You entered: prop

现在我在python程序中调用了这个脚本。我正在使用子流程模块这样做。据我所知,子流程模块创建了一个新流程。问题是当我执行python脚本时,我无法将参数传递给底层shell脚本,并且scipt处于hault阶段。有些人可以指出我在哪里做错了

python脚本(CHECK.PY):

import subprocess, shlex


cmd = "sh test.sh"
proc = subprocess.Popen(shlex.split(cmd), stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdout,stderr = proc.communicate()

print stdout

Python执行:check.py

 python check.py

2 个答案:

答案 0 :(得分:2)

您的代码正常运行,但自从您提及stdout=subprocess.PIPE后,内容将转到您在stdout中定义的stdout,stderr = proc.communicate()变量。从stdout=subprocess.PIPE电话中删除Popen()参数,您将看到输出。

或者,您应该使用subprocess.check_call()作为:

subprocess.check_call(shlex.split(cmd))

答案 1 :(得分:1)

实际上子进程确实有效 - 但是你没有看到提示,因为proc.communicate()正在捕获子进程的标准。您可以通过输入3个提示的值来确认这一点,并且最终应该看到提示和输入已回显。

只需删除stdout=subprocess.PIPE(stderr相同),子进程'stdout(stderr)将转到终端。

或者还有其他功能会启动子流程并为您调用communicate(),例如subprocess.call()subprocess.check_call()