【发布时间】: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