簡體   English   中英

Shell繼承Python的Popen子進程,包括stdin / out / err

[英]Shell inheriting Python's Popen child process, including stdin/out/err

我有一個可執行文件,需要很多輸入。 我想調用一個Python腳本,該腳本將運行可執行文件,傳遞一些輸入,然后在shell繼承子進程的情況下正常退出,同時使用常規的stdin / stdout / stderr設置,以便它可以繼續傳遞輸入。

簡單的使用者input.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. bash shell,stdin / stdout / stderr和所有命令都繼承了input.sh
  6. 用戶現在可以從input.sh看到stdout,並且可以在stdin上輸入“ def”以最終收到“ SUCCESS!”。 並退出代碼0。

我可能想得太多了,但我不知道如何從python腳本正常退出,以確保從input.sh中的stdin / stdout / stderr替換了Python腳本。 在這種情況下,Python腳本只是一個中介,應該通過回答一些提示給他或她並在稍后階段放棄控制來使用戶的生活更輕松。

您可以使用Popen.communicate向子進程發送數據或從子進程接收數據。 https://docs.python.org/3.6/library/subprocess.html#subprocess.Popen.communicate

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM