如何从子进程 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命令中捕获错误