簡體   English   中英

Python,運行子流程並讀取輸出,但未掛起程序

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM