デバイスから入力ストリームを取得する Linux アプリケーションがあります。その入力は、ユーザーに対して標準シェルをエミュレートできるように、シェル プロセスに送信する必要があります。これまでのところ、「/bin/sh」を実行するプロセスを作成し、その入力、出力、および stderr を次のようにリダイレクトしました。
import subprocess
p = subprocess.Popen(shell=False, args=['/bin/sh'], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
_make_nonblocking(p.stdout) # sets O_NONBLOCK
_make_nonblocking(p.stderr)
pass コマンドだけを実行すると、すべてが機能します。
p.stdin.write('pwd\n')
p.stdout.read()
'/home/dave\n'
自動補完のために、私は書いてみました:
p.stdin.write('ls s\t')
p.stdout.read()
IOError: [Errno 11] Resource temporarily unavailable
可能な補完のリストを取得することを期待していますが、標準入力に '\n' を入れるまで何も起こりません。(また、stderr には何も待機していませんでした)。
telnetd コードを調べたところ、pty の使用が見られました。pty.openpty() を使用してスレーブを標準入力に設定しようとしましたが、それも機能しませんでした。それはどのように行われるべきですか?
更新: -i パラメーターを提案どおりに使用しました。Popen を使用して ENTER を押すと、Python シェルが次のようにバックグラウンドに移動するという問題があります。
>>> p = subprocess.Popen(shell=False, args=['/bin/sh', '-i'], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
>>> <ENTER>
[1]+ Stopped ipython
$