跳转到主要内容

友好的misc/utils/convenience库

项目描述

友好的misc/utils/convenience库

Version on pypi Tested with Github Actions Test code codecov Python versions tested (link to github project)

概述

runez 是一个方便的 "utils" 库,用于我多次重写的常见操作。

最初的名字是“run ez”(“运行简单”),它听起来像“runes”,给它带来了一些神秘/魔法的一面,这也相对合适(它确实集中了一些召唤魔法,因为您可以通过使用它来节省很多重复的代码)

功能

  • 适用于任何Python版本

  • 纯Python独立库,不引入任何额外依赖

  • 处理大多数边缘情况,并具有友好的错误

    • 可以调用函数而不检查返回代码等(默认中止,并具有友好的错误)

    • 它们也可以通过设置 fatal=False 来调用,在这种情况下,返回值将指示调用是否成功

  • 支持 dryrun 模式(显示将要执行的操作,但不会实际执行)

  • 通过一次调用 runez.log.setup() 执行大多数典型的日志设置

  • 系统地记录操作(主要在调试级别),示例

    Running: foo ...
    Copy foo -> bar
    Would move foo -> bar    (for dryrun)
  • CaptureOutput 上下文管理器 -> 抓取任何代码段的输出/日志

  • 100% 测试覆盖率

示例

运行程序

import runez

# Aborts if "foo" doesn't exist
output = runez.run("ls", "foo")

# Output can also be ignored
runez.run("ls", "foo")

# Don't capture output, just run the command and let output "pass through"
runez.run("ls", "foo", stdout=None, stderr=None)

# Don't abort, return False on failure (or actual output when successful)
output = runez.run("ls", "foo", fatal=False)

文件操作

import runez

runez.touch("foo")
runez.copy("foo", "bar")
runez.move("foo", "baz")
runez.delete("foo")

runez.write("foo", "bar\nbaz\n")
content = "\n".join(runez.readlines("foo", first=10))

full_path = runez.resolved_path("foo/bar")
folder = runez.parent_folder(full_path)
runez.ensure_folder(folder)
with runez.Anchored(folder):
    assert runez.short(full_path) == "bar"

安装

如常,可在 pypi 上找到:pip install runez

理念

runez 试图在函数间提供一致的接口。以下是涉及 I/O(如写入、读取、复制文件等)功能的函数的主要原则

所有不返回内容的 IO 相关函数(如 run()delete() 等)具有以下共同签名:fatal=True, logger=UNSET, dryrun=UNSET

  • fatal:决定操作在失败时是否应引发异常

    • fatal=True(默认值):在失败时引发异常,记录有意义的错误

    • fatal=False:在失败时不引发异常,记录有意义的错误

    • fatal=None:在失败时不引发异常,也不记录任何内容

    • 在非致命模式下,调用尝试返回一个适合该调用的可用的值(请参阅每个函数的文档字符串)

  • logger:决定操作应该有多详细

    • LOG.error() 用于失败,除非 fatal 不是 True 并且提供的 logger 是可调用的

    • logger=UNSET(默认值)

      • LOG.debug("Running: ...") 以跟踪活动

      • print("Would run: ...") 在 dryrun 模式下

    • logger=False:仅记录错误(内部使用,避免在操作调用另一个操作时产生不必要的日志杂音)

    • logger=mylogger:调用提供的 mylogger() 以跟踪活动(例如:logger=MY_LOGGER.info

      • mylogger("Running: ...") 以跟踪活动

      • mylogger("Would run: ...") 在 dryrun 模式下

    • logger=None:不记录任何内容(甚至错误)

  • dryrun 允许为该调用仅覆盖当前的 runez.DRYRUN 设置

所有返回内容的 IO 相关函数(如 read_json()readlines() 等)使用基于 default=UNSET 的更简单的约定,它决定操作在失败时是否应引发异常

  • default 未提供时,函数调用将在失败时通过异常终止,并通过 LOG.error() 记录有意义的错误

  • default 提供(即使是 None)时,函数调用将不会终止,而是返回指定的 default,在这种情况下,调用者需要自己记录任何内容(在这种情况下,runez 不会产生任何日志杂音)

项目详情


发布历史 发布通知 | RSS 源

下载文件

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

源分布

runez-5.2.0.tar.gz (163.0 kB 查看哈希值)

上传时间

构建分布

runez-5.2.0-py3-none-any.whl (121.8 kB 查看哈希值)

上传于 Python 3

由以下支持