获取在Python中尚未返回的(OS)命令的输出

时间:2014-05-14 04:24:50

标签: python

要获得命令的输出,我们可以这样做

os.popen("ls").read()

但是假设我有一个命令,我不想等待它返回。事实上,我想让它继续运行,偶尔吐出一些输出。 (例如,java PrintEvery5)(假设PrintEvery5每5秒打印一行。)

如何订阅进程/线程并获取此输出?

我已尝试过以下操作,但似乎无法正常工作。

### file: deqthread.py
import threading, os, subprocess

class DeqThread(threading.Thread):
     def __init__(self):
         super(DeqThread, self).__init__()
         self.f=os.popen("java PrintEvery5")

     def run(self):
         print("in run")

     def readResult(self):
         return self.f.read() 


thread1 = DeqThread()
thread1.start()                                                                                                         

while True:

    print(thread1.readResult())

正在运行python deqthread.py,我看不到任何输出。整件事就在那里。

当我尝试这个时,我可以看到输出。 (即,它继续打印到控制台),

$python <ENTER>
>>> import os
>>> os.system("java PrintEvery5")

那么我需要在deqthread.py文件中进行哪些更改才能从命令中获得输出?

2 个答案:

答案 0 :(得分:0)

您是否尝试过使用check_output模块中的subprocess方法?它允许您使用参数运行命令并将其输出作为字节字符串返回。

import subprocess

output = subprocess.check_output(["echo", "Hello Java!"])
print output

所以__init__可能会成为:

def __init__(self):
     super(DeqThread, self).__init__()

readResult可能会成为:

def readResult(self):
     def readResult(self):
         output = subprocess.check_output(["echo", "Hello Java!"])
         return output 

请参阅此处的文档: https://docs.python.org/2/library/subprocess.html

答案 1 :(得分:0)

使用subprocess.Popen(),然后将stdout重定向到subprocess.PIPE。最后,从子流程实例的stdout成员获取输出。示例如下所示:

foo.py:

import time

count = 5
while count > 0:
    print 'Hello'
    count -= 1
    time.sleep(1)

main.py:

import subprocess

p = subprocess.Popen(['python.exe', 'foo.py'],
                     stdout=subprocess.PIPE,
                     stderr=subprocess.STDOUT)
for line in iter(p.stdout.readline, ''):
    print("OUTPUT: " + line.rstrip())