跳转到主要内容

基于事件的进程输出清除

项目描述

drainers 是围绕 subprocess.Popen 的抽象,以按事件方式读取和控制进程输出。它还允许您优雅或强制性地终止正在运行的进程,而无需直接与进程或线程本身交互。

概述

定义一个进程

Drainer 是围绕 subprocess.Popen 的工厂和控制包装器,因此接受所有(可选)参数,这些参数是 subprocess.Popen 初始化器所接受的。例如,最小的 Drainer 接受一个命令数组

from drainers import Drainer

def ignore_event(line, is_err):
        pass

my_drainer = Drainer(['ls', '-la'], read_event_cb=ignore_event)
my_drainer.start()

但,也允许额外的参数

my_drainer = Drainer(['echo', '$JAVA_HOME'], shell=True, bufsize=64,
                                         read_event_cb=ignore_event)
my_drainer.start()

保留给 Drainer 的两个参数是 stdoutstderrDrainer 要求它们必须是 subprocess.PIPE,并相应地为您设置它们。

定义回调函数

Drainer 的优势在于,从进程的标准输出或标准错误流中读取的每一行都会导致调用一个回调函数。这使得您可以处理几乎任何基于行的进程输出。

可以通过构造函数的 read_event_cb 参数指定回调函数,如上面的示例所示。它是必需的。指定的回调函数需要具有特定的签名

def my_callback(line, is_err):
        ...

它应接受两个参数:line(一个字符串)和is_err(一个布尔值)。后者表示该行是从标准错误流中读取的。除此之外没有其他内容。它不需要返回任何内容:它的返回值将被忽略。您的回调函数也可以是一个类方法,如下例所示。注意,在这种情况下,您将foo.my_method作为read_event_cb参数的值传递

class MyClass(object):

        def my_method(self, line, is_err):
                ...

foo = MyClass()
my_drainer = Drainer(['ls'], read_event_cb=foo.my_method)
my_drainer.start()

当前的粒度是单行。如果您想读取预定义的数据块(行),请使用BufferedDrainer。请参阅examples/buffer_results.py中的示例。

中止进程

Drainer 允许您在执行过程中强制中止正在运行的进程,当满足某些条件时,会向进程发送 terminate() 消息(Python 等同于 Unix 的 SIGTERM 消息)。默认情况下,进程不会被异常终止。为了指定终止标准,实现一个不接受任何参数且返回 True 表示希望中止,返回 False 表示不中止的回调函数。例如,对于长时间运行的进程,您可能希望在磁盘快满时终止它。但是检查空闲空间可能是一个耗时的操作,所以您可能只想偶尔进行此操作

def out_of_diskspace():
        left = handytools.check_disk_free()
        total = handytools.check_disk_total()
        return (left / total) < 0.03

# The following drainer executes the cruncher and checks whether the disk
# is (almost) full every 5 seconds.  It aborts if free disk space runs
# under 3%.
my_drainer = Drainer(['/bin/crunch', 'inputfile', 'outputfile'],
                     read_event_cb=ignore_event,
                                         should_abort=out_of_diskspace,
                                         check_interval=5.0)
exitcode = my_drainer.start()

示例相当直观。您可以通过检查退出码来查看进程的结果。

更多示例

有关更多详细示例,请参阅 examples 目录。

项目详情


下载文件

下载您平台上的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。

源分发

drainers-0.0.3.tar.gz (9.0 kB 查看散列

上传时间

支持者

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面