首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python,运行子进程并读取输出,而不挂起程序

Python,运行子进程并读取输出,而不挂起程序
EN

Stack Overflow用户
提问于 2013-07-03 07:55:35
回答 1查看 318关注 0票数 0

这里的第一个帖子,我必须说我对一般的编程有点业余……我在osx上使用python 2.7.5子进程模块来读取一个名为dns-sd的实用程序的输出。

目标是找出我的网络上正在运行哪些SSH文件服务器。使用"dns-sd -B _ssh._tcp“。在以下使用中工作正常:

代码语言:javascript
复制
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输出的新行将自动通过打印显示。下面是一个典型的输出:

代码语言:javascript
复制
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模块,但我并不真正理解它们是如何工作的……我想我必须启动一个线程来运行这个实用程序,然后再启动另一个线程来监听它?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-07-03 08:14:02

下面是作为新进程运行的类的一个非常基本的实现。这将允许您在主脚本/进程中继续执行,但您将需要使用某种进程间通信(即。共享内存数据结构( described in multiprocessing docs),如果您想对父进程中的子进程的输出执行任何操作。

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17437649

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档