如何从子进程 python 2.7 和 Apache 读取实时输出

Posted

技术标签:

【中文标题】如何从子进程 python 2.7 和 Apache 读取实时输出【英文标题】:How to read live output from subprocess python 2.7 and Apache 【发布时间】:2015-07-13 14:20:37 【问题描述】:

我有一个 Apache Web 服务器,我编写了一个 python 脚本来运行一个命令。我正在运行的命令正在启动一个 ROS 启动文件,该文件可以无限期地工作。我想实时读取子流程的输出并将其显示在页面中。到目前为止,我的代码只能在终止进程后才能打印输出。我已经尝试了网络上的各种解决方案,但它们似乎都不起作用

command = "roslaunch package test.launch"
proc = subprocess.Popen(
   command,
   stdout=subprocess.PIPE,
   stderr=subprocess.STDOUT,
   env=env,
   shell=True,
   bufsize=1,
)
print "Content-type:text/html\r\n\r\n"
for line in iter(proc.stdout.readline, ''):
   strLine = str(line).rstrip()
   print(">>> " + strLine)
   print("<br/>")

【问题讨论】:

你试过打电话给sys.stdout.flush()吗? 您的代码和屏幕之间可能存在其他缓冲区。您是否尝试过明显的事情,例如删除subprocess 并暂停打印:print "Content-type:text/html\r\n\r\n" for i in range(100): print ("%02d" % i) * 10000; time.sleep(1)(也许您应该使用Transfer-Encoding: chunk ok tnx 我会试试,但是你说的 drop subprocess 是什么意思?我该怎么做? "drop subprocess" 意味着为了调试目的,删除所有子进程相关的代码——如果你不能让简单的打印语句工作,那么复杂化就没有意义了你的例子使用subprocess。见how to create a minimal complete code example 我试过了,它可以工作,但它会在 100 秒后一次打印出来,而不是一个一个地打印...... 【参考方案1】:

问题是roslaunch 的输出正在被缓冲。 subprocess 不是在这种情况下进行实时输出处理的最佳工具,但 Python 中有一个完美的工具来完成该任务:pexpect。以下 sn-p 应该可以解决问题:

import pexpect

command = "roslaunch package test.launch"
p = pexpect.spawn(command)
print "Content-type:text/html\r\n\r\n"
while not p.eof():
    strLine = p.readline()
    print(">>> " + strLine)
    print("<br/>")

【讨论】:

以上是关于如何从子进程 python 2.7 和 Apache 读取实时输出的主要内容,如果未能解决你的问题,请参考以下文章

python - 如何从子进程中运行的ghostscript命令中捕获错误

如何从子进程中获取环境?

如何从子进程设置父进程的外壳环境

Python分别从子进程stdout和stderr读取,同时保留顺序

无法从子进程访问内存映射(Python 3.8)

如何在 python 2.7 32bit 中获取 64bit 进程的内存工作集?