0

プロセス内で対話型プログラムを呼び出し、プロセスの実行中にその出力を出力する必要があります。これまでのところ、私はこの関数でそれを行っています:

def call(command):
    process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)

    while True:
        line = process.stdout.readline().rstrip().encode("utf-8")
        if line == '':
            break
    
        print(line)

    process.wait()
    return process.returncode

問題は、対話型プログラムがユーザー入力を待機し、質問の後に新しい行を追加しない可能性があることです。たとえば、次のようになります。

認証レルム:...>..。

ユーザー名:

「Username:」の後に改行はなく、プログラムはユーザー入力を予期しているため、コードに「Username:」が表示されません。

readline()の代わりにbytesavailableやread(size)のような関数が必要ですが、bytesavaiable()のような関数はありません。

4

1 に答える 1

3

プログラムの出力を自分でキャプチャする必要がありますか、それともユーザーに表示する必要がありますか?表示する必要があるだけの場合は、プロセスに直接stdoutに書き込ませることを検討してください。

process = subprocess.Popen(command, shell=True)

これにより、独自のパススルーソリューションを一緒にハックする必要がなくなります。


プログラム出力をキャプチャする必要がある場合は、サイズを指定せずに呼び出すことができます.read()。読み取るデータが得られるまで(またはストリームが終了するまで、この場合は空の文字列を返します)ブロックしますが、とは異なり、行の終わりまで待つ必要はありません.readline()

于 2013-02-11T00:16:24.317 に答える