4

python ptyモジュールを使用して、いくつかのコマンドをターミナルエミュレーターに送信し、stdinとしての関数を使用して(ptyモジュールが必要とするように)、強制終了します。私は次のようなことを考えました

import pty
cmnds = ['exit\n', 'ls -al\n']
# Command to send. I try exiting as last command, but it doesn't works.

def r(fd):
    if cmnds:
        cmnds.pop()
        # It seems is not executing sent commands ('ls -al\n')
    else:
        # Can i quit here? Can i return EOF?
        pass

pty.spawn('/bin/sh', r)

ありがとうございました

4

1 に答える 1

2

まず、このptyモジュールでは、Python が実行されているターミナル エミュレーターと通信することはできません。代わりに、Python がターミナル エミュレーターのふりをすることができます

のソースコードを見るとpty.spawn()、生成されたプロセスが実行中に Python の stdin と stdout を引き継ぐように設計されているように見えますが、これはあなたが望むものではありません。

シェルを生成し、シェルにコマンドを送信し、出力を読み取りたい場合は、おそらく Python のsubprocessモジュールが必要です (特に、実行するコマンドが 1 つだけの場合は、subprocess.Popenクラスの.communicate()メソッドが役立ちます)。

サブプロセスをパイプではなく pty で実行する必要がある場合は、を使用os.openpty()してマスターとスレーブのファイル記述子を割り当てることができます。スレーブ ファイル記述子をサブプロセスの stdin および stdout として使用し、コマンドをマスター ファイル記述子に書き込み、そこから応答を読み取ります。

于 2013-01-10T04:29:14.230 に答える