Shell继承Python的Popen子进程,包括stdin / out / err

时间:2017-05-10 03:19:07

标签: python linux

我有一个需要大量输入的可执行文件。我想调用一个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"
  1. 用户,在bash shell上执行上面的python脚本
  2. Python脚本执行input.sh
  3. Python脚本在看到正确的提示时将“abc”传递给input.sh stdin
  4. Python脚本执行上述MAGIC并退出
  5. input.sh由bash shell继承,stdin / stdout / stderr和所有
  6. 用户现在可以从input.sh看到stdout并且可以在stdin上输入“def”以最终收到“SUCCESS!”并退出代码0。
  7. 我可能会过度思考但我不知道如何优雅地退出python脚本,确保input.sh中的stdin / stdout / stderr取代了Python脚本。在这种情况下,Python脚本只是一个中介,它应该通过回答他或她的一些提示并在稍后阶段放弃控制来使用户的生活更轻松。

1 个答案:

答案 0 :(得分:0)

您可以使用Popen.communicate向子进程发送数据和从子进程接收数据。 https://docs.python.org/3.6/library/subprocess.html#subprocess.Popen.communicate