要获得命令的输出,我们可以这样做
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
文件中进行哪些更改才能从命令中获得输出?
答案 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
答案 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())