与python的子流程模块相比,提供了一种稍微更方便的方法来启动流程的库。
nicecall的Python项目详细描述
如何使用库
注意:确保您还检查了测试 举例说明如何使用库。下面的大部分代码都在 tests/smoke/test\u docs.py 中。
流畅的界面
库使用方法链接,它允许在实际启动进程之前动态添加逻辑。方法,例如 on_stdout , ignore 等。创建对象的副本,修改此副本,并将其返回给调用方。这样就可以在代码的多个位置重用基本对象,减少代码重复。
退出代码
让我们从执行任务开始:
result = nicecall.Process().execute(["touch", "/tmp/hello"])
结果 包含退出代码,因此可以确定进程是否成功终止。下面, result 的值应为零。您也可能会失败:
result = nicecall.Process().execute(["touch", "/tmp/a/b/c/d"])
如果您没有
有时,如果进程失败,人们可能更喜欢引发异常,而不是手动检查退出代码。 raise_if_error() 方法可用于此操作。调用时,与零不同的退出代码将导致引发子流程。CalledProcesserror 。
stdout 和 stderr
还可以对 stdout 和 stderr 执行一系列操作。让我们在终端中显示stdout
nicecall.Process().on_stdout(print).execute(["echo", "a\nb\nc"])
输出应为:
a b c
如果您只想读取 stdout 输出,那么您可以使用 read\u stdout 来代替 execute 。以下代码产生相同的输出:
lines = nicecall.Process().read_stdout(["echo", "a\nb\nc"]) print("\n".join(lines))
注意,当使用 read_stdout 时,一个非零的退出代码 将导致 子进程.调用的进程错误被引发,而与链中是否存在 raise_error() 无关.选择此选项的原因是,使用 read\u stdout ,无法检查实际的退出代码,而直接忽略它将导致调试困难。
还要注意,read_stdout 将 stdout 存储在一个列表中,并且不是惰性的。这意味着:
< Buff行情>- 此方法仅适用于输出少量行的命令。
-
在行中循环并在中间停止不会影响退出代码的处理,也不会影响其他操作,例如在链的前面通过stdout
指定的日志记录。 - stderr 中的行不会返回。仍然可以使用 on-stderr 方法,与 execute 方法完全相同。
- 在返回列表之前,将执行通过stdout上的 定义的所有操作。
- 通过 keep 和 ignore添加的过滤器也适用于结果中的行。
日志记录
至少在我的例子中,一个常见的事情是将 stdout 或 stderr 记录到syslog。有了 niceCall ,就很容易了:
# Initialize logging. log_handler = logging.handlers.SysLogHandler(address="/dev/log") formatter = logging.Formatter("demo: [%(levelname)s] %(message)s") log_handler.setFormatter(formatter) log_handler.setLevel(logging.DEBUG) demo_logger = logging.getLogger("demo") demo_logger.setLevel(logging.DEBUG) demo_logger.addHandler(log_handler) ... # Log stdout. logger = nicecall.StdoutLogger("test") nicecall.Process().on_stdout(logger.log).execute(["echo", "a\nb"])
注意 很好call.stdoutlogger 可以用记录器的名称或记录器本身的实例初始化。
库本身通过名为nicecall.process 的记录器记录调用( 信息 级别)和调用失败( 警告 级别)。例如,执行 touch/tmp/a/b/c/d 将生成两条日志消息:
INFO:nicecall.process:Called "touch /tmp/a/b/c/d". WARNING:nicecall.process:"touch /tmp/a/b/c/d" failed with exit code 1.
过滤
有时,您不想处理特定的内容,如空行或空白。这就是过滤器的作用:
nicecall \ .Process() \ .ignore(nicecall.filters.whitespace) \ .on_stdout(print) \ .execute(["echo", "a\n\nb"])
在这里, a 和 b 将显示在终端中;但是,空行将被忽略。反之称为保持。keep 和ignore都接受任何以字符串作为参数并返回布尔值的函数。例如,这将只打印长度超过15个字符的标准输出内容:
nicecall \ .Process() \ .keep(lambda line: len(line) > 15) \ .on_stdout(print) \ .execute(["echo", "Hello World!\nWhat a lovely day!"])
可以组合多个 keep 和 ignore 方法。输出将保留与 keep 方法和 none 方法中的 谓词匹配的行。
过滤器同时适用于 stdout 和 stderr ;无法将它们仅应用于其中一个流。