当前位置: 首页 > 面试题库 >

从需要stdin的子进程实时打印stdout

苍志文
2023-03-14
问题内容

这是此问题的后续措施,但是如果我想将参数传递stdinsubprocess,如何实时获取输出?这就是我目前拥有的;我也尝试从模块中替换Popen为,这只会导致脚本挂起。call``subprocess

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 = '\n'.join(['subfolder1','subfolder2'])
output = p.communicate(input=subfolders)[0]
print output

在我不必通过的前一个问题中,stdin建议我使用p.stdout.readline,没有空间输送任何东西到stdin

附录:这适用于传输,但是我只能在最后看到输出,并且我想查看传输发生时的详细信息。


问题答案:

为了实时从子流程中获取标准输出,您需要准确确定所需的行为;具体来说,您需要确定是要逐行处理还是逐字符处理输出,以及是要在等待输出时阻塞还是要在等待时执行其他操作。

您的情况似乎很可能足以满足您的情况,以行缓冲的方式读取输出,直到每个完整的行进入时才阻塞,这意味着提供的便利功能subprocess就足够了:

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()

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

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

吴佩慈 对方的回答,没有必要通过间接以文件通过输入到子进程。



 类似资料:
  • 更新:我发现了一个关键部分,解释了为什么这可能不起作用!我使用了这个系统。放样(out);其中out是到JTextArea的特殊打印流 这是代码,但我遇到的问题是,信息只有在我结束流程后才会打印出来。 电流输出: 这是正确的输出,但是当我结束这个过程时,它只是作为一个大块打印。 有人知道问题是什么吗?如果是的话,你能帮我解释一下为什么会这样吗,提前谢谢你。

  • 问题内容: 为了从我的Python脚本启动程序,我使用以下方法: 因此,当我启动像这样的过程时我的程序将等待直到该过程完成为止,然后我才能获得程序的完整输出。如果我正在运行需要一段时间才能完成的过程,这将很烦人。 我可以让我的程序通过在循环完成之前轮询过程输出来逐行写过程输出吗? 问题答案: 你可以在命令输出行之后立即使用处理行。这是显示典型用例的完整示例:

  • 我试图与一个进程通信(该进程本身会写入stdin和stdout,以便在终端中与用户交互),并在C中读取它的stdin和写入它的stdout。 因此,我尝试以编程方式替换shell用户。一个methapohrical示例:假设出于某种原因我想在C中使用VIM。然后我还需要编写命令(stdout)并从编辑器(stdin)中读取内容。 起初我认为这可能是一项微不足道的任务,但似乎没有标准的方法<代码>i

  • 问题内容: 我正在尝试编写一个Python脚本来启动一个子进程,并将其写入子进程stdin。我还希望能够确定子进程崩溃时要采取的措施。 我试图启动的过程是一个名为的程序nuke,它具有自己的Python内置版本,我希望能够向其提交命令,然后告诉其在命令执行后退出。到目前为止,我已经得出结论,如果我在类似这样的命令提示符下启动Python,然后作为子进程启动,那么我可以在中键入命令,但是我希望能够将

  • 问题内容: 我试图从通话中抢夺,尽管我可以通过以下方式轻松实现此目标: 我想“实时”抓取。使用上述方法,PIPE等待获取所有内容,然后返回。 因此,出于日志记录目的,这不符合我的要求(例如,“查看”发生的情况)。 在运行时,有没有办法逐行获取?或者这是(必须等到关闭)的限制。 编辑 如果我切换为我只得到(不理想)的最后一行: 问题答案: 您的解释器正在缓冲。在打印语句后,添加对sys.stdout

  • 问题内容: 如何打印指示的div(而无需手动禁用页面上的所有其他内容)? 我想避免使用新的预览对话框,因此使用此内容创建新窗口没有用。 该页面包含几个表,其中一个表包含我要打印的div-该表已为网络设置了视觉样式,不应以打印形式显示。 问题答案: 这是一个通用的解决方案, 仅 使用 CSS ,我已经验证可以使用。 替代方法不是很好。使用非常棘手,因为如果有任何元素,则任何后代都不会显示。要使用它,