【问题标题】:how to call an interactive program and show output immediately如何调用交互式程序并立即显示输出
【发布时间】:2013-02-11 00:09:11
【问题描述】:

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

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

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

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

用户名:

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

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

【问题讨论】:

  • 请改用communicate。它还避免了缓冲问题(程序因管道已满而卡住)。
  • @Cameron communicate 仅在程序终止之前不需要输出时才有效(因为它仅在进程完成后返回)。
  • @Amber:嗯,我可以发誓它是非阻塞的,但文档表明你是对的 :-)

标签: python python-3.x subprocess


【解决方案1】:

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

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

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


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

【讨论】:

  • 谢谢!我只需要显示它,所以我的版本肯定是过度设计的......
猜你喜欢
  • 2011-12-02
  • 1970-01-01
  • 2010-09-17
  • 2019-08-28
  • 2014-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多