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

从需要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

  • 我目前遇到的一个问题是,一旦我生成了这样的子进程并再次开始键入输入字符,这些字符就会被生成的子进程通过stdin接收。这并不奇怪,因为我在分叉子文件描述符后不会修改它们,而且我理解这意味着它们都与主进程共享底层的同一个流。 然而,这不是我的意图。在这方面,我希望我的程序的行为类似于例如,这样,在后台启动正在进行的进程后重新获得提示符后,在该提示符上键入的任何字符将只被bash看到,而不是被派生的进