与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"])

如果您没有 /tmp/a/b/c目录, 结果现在应该是 1

有时,如果进程失败,人们可能更喜欢引发异常,而不是手动检查退出代码。 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 ;无法将它们仅应用于其中一个流。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
Java泛型和基类   ProcessBuilder或DefaultExecutor启动的“RunAs”子进程的java读取标准输出   java应用程序在尝试登录时突然停止   Java:神秘的Java未捕获异常处理程序[带代码]   java JavaFX NumberAxis自动范围无限循环   最新版本和旧版本冲突的java双Maven依赖关系   java如何导入带有部署变量类名的静态函数?   编译器构造不同的JDK更新会产生不同的Java字节码吗?   java无法在struts 1.1中上载任何超过250 MB大小的文件   java调整jcombobox下拉菜单的宽度   java如何在某些情况下忽略@SQLDelete注释   在Eclipse for Java EE developers edition中禁用HTML警告   java HttpUrlConnection重置请求属性   java@Provider资源未在rest应用程序中注册   java TOP N使用JPA连接   java在使用反射调用方法时区分int和Integer参数