[英]Python, running a subprocess and read output and not hanging the program
在这里的第一篇文章,我必须说我对编程总体上有点业余...我正在osx上使用python 2.7.5子进程模块来读取名为dns-sd的实用程序的输出。
目的是找出我的网络上正在运行哪些SSH文件服务器。 使用“ dns-sd -B _ssh._tcp”。 在以下用途中可以正常工作:
from sys import *
from subprocess import *
class ProcessNAS(object):
def __init__ (self, name):
self.name = name
self.status = False
self.process = None
def StartCheck(self):
print "Checking for NAS..."
stdout.flush()
self.process = Popen( ["dns-sd", "-B", "_ssh._tcp", "."], stdout=PIPE )
while True:
line = self.process.stdout.readline()[:-1]
print line
if "Add" in line and self.name in line:
self.status = True
print "NAS '" + self.name + "' is available."
elif "Rmv" in line and self.name in line:
self.status = False
print "NAS '" + self.name + "' is unavailable."
newCheckNAS = ProcessNAS("Drobo-FS")
newCheckNAS.StartCheck()
请注意,这是一个“实时”实用程序,如果Python脚本继续运行,则dns-sd输出的新行将自动通过打印显示。 这是一个典型的输出:
Checking for NAS...
Browsing for _ssh._tcp
DATE: ---Tue 02 Jul 2013---
19:44:30.670 ...STARTING...
Timestamp A/R Flags if Domain Service Type Instance Name
19:48:07.061 Add 2 4 local. _ssh._tcp. Drobo-FS
NAS 'Drobo-FS' is available.
我遇到的问题是,一旦我执行newCheckNAS.StartCheck(),程序的其余部分将仅等待dns-sd实用程序完成才能继续。 但是这个实时工具永远不会停止,它需要在后台继续监视。
我研究了各种线程,多处理甚至pybonjour模块,但我不太了解它们的工作原理……我想我必须启动一个运行该实用程序的线程,另一个线程来监听它?
这是您的类的非常基本的实现,它作为新进程运行。 这将允许您继续在主脚本/进程中执行, 但是如果您想对子进程的输出进行任何操作,则需要使用某种进程间通信(即, 在multiprocessing
docs中描述的共享内存数据结构)。在父母中。
from sys import *
from subprocess import *
import multiprocessing
class ProcessNAS(multiprocessing.Process):
def __init__ (self, name):
self.name_ = name
self.status = False
self.process = None
super(ProcessNAS, self).__init__(target=self.StartCheck)
def StartCheck(self):
print "Checking for NAS..."
stdout.flush()
self.process = Popen( ["dns-sd", "-B", "_ssh._tcp", "."], stdout=PIPE )
while True:
line = self.process.stdout.readline()[:-1]
print line
if "Add" in line and self.name_ in line:
self.status = True
print "NAS '" + self.name_ + "' is available."
elif "Rmv" in line and self.name_ in line:
self.status = False
print "NAS '" + self.name_ + "' is unavailable."
newCheckNAS = ProcessNAS("Drobo-FS")
newCheckNAS.start() # <-- instead of StartCheck(), call start()
import time
time.sleep(4)
newCheckNAS.terminate() # <-- now have two processes - able to kill the child
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.