如何调用交互式程序并立即显示输出

时间:2013-02-11 00:09:12

标签: python python-3.x subprocess

我需要在进程中调用交互式程序并在进程运行时打印其输出。到目前为止,我正在使用此功能:

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

问题是,交互式程序可能会等待用户输入,并且在问题之后不会添加新行,例如:

  

身份验证领域:...> ...

     

用户名:

在“用户名:”之后,没有新行,程序需要用户输入,因此我的代码不会显示“用户名:”。

而不是readline()我需要一些像bytesavailable和read(size)这样的函数,但是没有像bytesavaiable()这样的函数。

1 个答案:

答案 0 :(得分:3)

您是否需要自己捕获程序的输出,或者只是需要将其显示给用户?如果只需要显示,请考虑让进程直接将其写入stdout:

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

这巧妙地避免了将自己的传递解决方案整合在一起的必要性。


如果 需要捕获程序输出,则只需调用.read()而无需指定大小。它将阻塞,直到它有一些数据要读取(或直到流完成,在这种情况下它将返回一个空字符串),但它不一定要等到一行返回,不像{{ 1}}。