我需要在进程中调用交互式程序并在进程运行时打印其输出。到目前为止,我正在使用此功能:
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()这样的函数。
答案 0 :(得分:3)
您是否需要自己捕获程序的输出,或者只是需要将其显示给用户?如果只需要显示,请考虑让进程直接将其写入stdout:
process = subprocess.Popen(command, shell=True)
这巧妙地避免了将自己的传递解决方案整合在一起的必要性。
如果 需要捕获程序输出,则只需调用.read()
而无需指定大小。它将阻塞,直到它有一些数据要读取(或直到流完成,在这种情况下它将返回一个空字符串),但它不一定要等到一行返回,不像{{ 1}}。