我有一个需要大量输入的可执行文件。我想调用一个python脚本,它将运行可执行文件,传递一些输入,然后正常退出,而shell继承子进程,使用正常的stdin / stdout / stderr设置,以便它可以继续传递输入。
简单的消费者输入.sh:
#/bin/bash
echo "expected input: abc"
read in1
if [ "$in1" != "abc" ]; then
echo "wrong!"
exit 1
fi
echo "expected: def"
read in2
if [ "$in2" != "def" ]; then
echo "wrong!"
exit 1
fi
echo "SUCCESS!"
中间python脚本:
#!/usr/bin/python
import sys
import subprocess
proc = subprocess.Popen('/Users/myuser/input.sh', shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE)
out = proc.stdout.readline()
if "expected input: abc" in out:
proc.stdin.write("abc\n")
out = proc.stdout.readline()
if "expected input: def" in out:
print "my job is done here, you take over"
# MAGIC HERE! redirect proc streams to parent and exit gracefully
else:
print "error"
else:
print "error"
我可能会过度思考但我不知道如何优雅地退出python脚本,确保input.sh中的stdin / stdout / stderr取代了Python脚本。在这种情况下,Python脚本只是一个中介,它应该通过回答他或她的一些提示并在稍后阶段放弃控制来使用户的生活更轻松。
答案 0 :(得分:0)
您可以使用Popen.communicate
向子进程发送数据和从子进程接收数据。
https://docs.python.org/3.6/library/subprocess.html#subprocess.Popen.communicate