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

从Python中的另一个进程实时拦截标准输出

段宏毅
2023-03-14
问题内容

我想运行一个系统进程,拦截输出,并在Python脚本中逐行实时地对其进行修改。

我的最佳尝试是等待过程完成后再打印,它是:

#!/usr/bin/env python
import subprocess

cmd = "waitsome.py"
proc = subprocess.Popen(cmd, shell=True, bufsize=256, stdout=subprocess.PIPE)
for line in proc.stdout:
    print ">>> " + line.rstrip()

该脚本waitsome.py仅每半秒打印一行:

#!/usr/bin/env python
import time
from sys import stdout

print "Starting"
for i in range(0,20):
    time.sleep(0.5)
    print "Hello, iteration", i
    stdout.flush()

是否有一个简单的解决方案可以subprocess实时迭代输出?我必须使用线程吗?

从前,我用Perl编写脚本,这真是小菜一碟:

open(CMD, "waitsome.py |");
while (<CMD>) {
    print ">>> $_";
}
close(CMD);

问题答案:

遍历文件不可避免地将大量内容缓冲-这是所有Python 2. *实现的一个已知问题。它可以按照您在Python 3.1中的预期工作,最终循环略有不同:

for line in proc.stdout:
    print(">>> " + str(line.rstrip()))

如果升级到Python 3.1是不切实际的(并且我知道通常是这样!),请换一种方式,以老式的方式编写循环-循环的以下版本确实可以在Python 2中实现。

while True:
    line = proc.stdout.readline()
    if not line:
        break
    print ">>> " + line.rstrip()


 类似资料:
  • 问题内容: 我想在Windows中使用rsync.exe,并在Python中打印标准输出。 我的代码可以运行,但是直到文件传输完成后才能捕获进度!我想实时打印每个文件的进度。 既然我听说使用Python 3.1,现在应该会更好地处理IO。 问题答案: 一些经验法则。 永远不要使用。它不必要地调用额外的shell进程来调用您的程序。 调用进程时,参数作为列表传递。sys.argv在python中是一

  • 问题内容: 我有一些脚本应该已经停止运行,但是永远挂在身边。我是否可以通过某种方式以一种可读的方式弄清楚它们正在向STDOUT和STDERR写入什么内容? 例如,我尝试执行以下操作: 但这确实不起作用。无论如何,这是一个远射。 还有其他想法吗? 就其本身而言,它很冗长且难以理解。 注意:我 只 对它们的输出感兴趣,而对其他任何东西都不感兴趣。我有能力自己弄清其他事情;这个问题只集中在获得访问std

  • 问题内容: 我想在我的Java程序中读取c-Application的输出流。 iremoted (可在此处获得:http : _//osxbook.com/software/iremoted/download/iremoted.c_ )是一个C应用程序,如果按下了Apple Remote遥控器上的按钮,它将显示诸如“ 0x19按下”的单独行。如果我启动改头换面的程序,那么一切都会很好,每当我按下一

  • 我有以下要求: 在结帐过程中,一旦用户位于结帐页面,如果用户试图“逃离”这个结帐URL(例如:转到主页或我的帐户部分或任何其他外部页面),它必须再次重定向到结帐URL。有什么方法可以使用Spring拦截器来实现这一点吗?

  • 问题内容: 我想要一个小的“应用程序加载器”程序,该程序可以通过TCP从外部服务器接收其他二进制应用程序文件并运行它们。 我可以通过将传输的文件保存到硬盘上并使用system()调用来运行它来完成此操作。但是,我想知道是否有可能从内存中启动新应用程序而不接触硬盘驱动器。 加载新应用程序后,加载程序应用程序的状态无关紧要。我更喜欢使用C,但是也欢迎使用C ++解决方案。我还要坚持使用标准Linux

  • 问题内容: 我发现了很多关于如何创建使用像Spring框架登录定制方面的例子这还是这个,但没有发现这种情况和问题,standard/common Spring实现。是否有来自Spring的日志记录方面的任何标准实现? 问题答案: 签出CustomizableTraceInterceptor API,你可以定义带有几个占位符的单独的enter / exit / exception消息: -替换为被调