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

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

认证领域:...> ...

用户名:

在“用户名:”之后,没有新行并且程序需要用户输入,所以我的代码没有显示“用户名:”。

除了 readline(),我需要一些函数,比如 bytesavailable 和 read(size),但是没有 bytesavaiable() 这样的函数。

4

1 回答 1

3

您需要自己捕获程序的输出,还是只需要将其显示给用户?如果只是需要显示,可以考虑让进程直接将其写入标准输出:

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

这巧妙地避免了将您自己的直通解决方案组合在一起的需要。


如果您确实需要捕获程序输出,您可以直接调用.read()而不指定大小。它会阻塞直到它有一些数据要读取(或者直到流完成,在这种情况下它会返回一个空字符串),但它不一定要等到行尾才返回,不像.readline().

于 2013-02-11T00:16:24.317 回答