我有一个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
答案 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()