从需要标准输入的子进程实时打印标准输出

printing stdout in realtime from a subprocess that requires stdin(从需要标准输入的子进程实时打印标准输出)
本文介绍了从需要标准输入的子进程实时打印标准输出的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是这个问题的后续行动,但如果我愿意要将参数传递给 stdinsubprocess,我怎样才能实时获得输出?这是我目前拥有的;我还尝试用 subprocess 模块中的 call 替换 Popen,这只会导致脚本挂起.

This is a follow up to this question, but if I want to pass an argument to stdin to subprocess, how can I get the output in real time? This is what I currently have; I also tried replacing Popen with call from the subprocess module and this just leads to the script hanging.

from subprocess import Popen, PIPE, STDOUT
cmd = 'rsync --rsh=ssh -rv --files-from=- thisdir/ servername:folder/'
p = Popen(cmd.split(), stdout=PIPE, stdin=PIPE, stderr=STDOUT)
subfolders = '
'.join(['subfolder1','subfolder2'])
output = p.communicate(input=subfolders)[0]
print output

在我不必通过 stdin 的前一个问题中,我被建议使用 p.stdout.readline,那里没有空间可以传输任何内容标准输入.

In the former question where I did not have to pass stdin I was suggested to use p.stdout.readline, there there is no room there to pipe anything to stdin.

附录:这适用于转移,但我只在最后看到输出,我想在转移发生时查看转移的详细信息.

Addendum: This works for the transfer, but I see the output only at the end and I would like to see the details of the transfer while it's happening.

推荐答案

为了实时从子进程中获取标准输出,你需要准确地决定你想要什么行为;具体来说,您需要决定是要逐行处理输出还是逐字符处理,以及是要在等待输出时阻塞还是在等待时能够做其他事情.

In order to grab stdout from the subprocess in real time you need to decide exactly what behavior you want; specifically, you need to decide whether you want to deal with the output line-by-line or character-by-character, and whether you want to block while waiting for output or be able to do something else while waiting.

看起来它可能足以让您的情况以行缓冲方式读取输出,阻塞直到每个完整的行进入,这意味着 subprocess 提供的便利功能已经足够好:

It looks like it will probably suffice for your case to read the output in line-buffered fashion, blocking until each complete line comes in, which means the convenience functions provided by subprocess are good enough:

p = subprocess.Popen(some_cmd, stdout=subprocess.PIPE)
# Grab stdout line by line as it becomes available.  This will loop until 
# p terminates.
while p.poll() is None:
    l = p.stdout.readline() # This blocks until it receives a newline.
    print l
# When the subprocess terminates there might be unconsumed output 
# that still needs to be processed.
print p.stdout.read()

如果您需要写入进程的标准输入,只需使用另一个管道:

If you need to write to the stdin of the process, just use another pipe:

p = subprocess.Popen(some_cmd, stdout=subprocess.PIPE, stdin=subprocess.PIPE)
# Send input to p.
p.stdin.write("some input
")
p.stdin.flush()
# Now start grabbing output.
while p.poll() is None:
    l = p.stdout.readline()
    print l
print p.stdout.read()

Pace 另一个答案,不需要间接通过文件来将输入传递给子进程.

Pace the other answer, there's no need to indirect through a file in order to pass input to the subprocess.

这篇关于从需要标准输入的子进程实时打印标准输出的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

Leetcode 234: Palindrome LinkedList(Leetcode 234:回文链接列表)
How do I read an Excel file directly from Dropbox#39;s API using pandas.read_excel()?(如何使用PANDAS.READ_EXCEL()直接从Dropbox的API读取Excel文件?)
subprocess.Popen tries to write to nonexistent pipe(子进程。打开尝试写入不存在的管道)
I want to realize Popen-code from Windows to Linux:(我想实现从Windows到Linux的POpen-code:)
Reading stdout from a subprocess in real time(实时读取子进程中的标准输出)
How to call type safely on a random file in Python?(如何在Python中安全地调用随机文件上的类型?)