跳到主要内容

转载自 管窥程序

Envoy —— 一个经典的 Python 库

继续我们的有趣的 Python 库之旅 ——

一个小小的库,或许能避免重复造轮子

一个不显眼的功能,也许能在关键时刻拯救我们

一个出乎意料的方法,或许能激发更多创意灵感

一个独特的技能,也许能成为我们的守护神……


  • 在工作中有没有遇到过需要在 Python 脚本中执行系统级别命令的情况?

  • 也许你尝试过直接使用 Python 的 subprocess 模块,但是感到太过繁琐和不够直观。

  • 今天,我要介绍的 Envoy 库就是为了让这个过程变得简单而优雅。

  • 无论是运行一个简单的脚本还是创建一个复杂的命令管道,Envoy 都能够以人性化的方式简化操作。

Envoy 简介

  • Envoy 是由知名的 requests 库作者 Kenneth Reitz 开发的。

  • 它提供了一种人性化的方法来快速执行和管理子进程。

  • Envoy 真正的魅力在于,它让命令执行变得简洁,尤其是在需要执行短期的系统命令时,其方便性远胜 requests 库。

  • 与直接使用原生 subprocess 模块相比,Envoy 则更加直观和易于使用。

  • 项目地址:https://github.com/kennethreitz/envoy

安装 Envoy

  • 由于 Envoy 并不是 Python 的标准库,我们需要使用 pip 来进行安装:
pip install envoy

基本用例

执行命令

  • 使用 Envoy 执行系统命令就像在 Shell 环境下操作一样简单。以下是一个基本示例:
import envoy
# 运行 'git config' 命令
r = envoy.run('git config')

print(r.status_code) # 输出:129
print(r.std_out) # 输出:'usage: git config [options]'
print(r.std_err) # 输出:''
  • 通过这样简单的几行代码,我们就能执行命令并获取结果。

管道操作

  • Envoy 还支持 Shell 式的管道操作。你可以很容易地将一个命令的输出作为另一个命令的输入:
r = envoy.run('uptime | pbcopy')

print(r.command) # 输出:'pbcopy'
print(r.status_code) # 输出:0
print(r.history) # 输出:[<Response 'uptime'>]
  • 这种管道操作保留了历史记录,所以你可以轻松追踪到整个命令序列。

高级特性

超时与数据管道

  • Envoy 还允许你设定超时时间,并能将数据作为命令的输入,这对于需要交互操作的命令来说非常有用:
r = envoy.run('git config', data='user.name=FooBar', timeout=2)

# 检查操作是否在规定时间内完成
if r.status_code == 0:
print("命令执行成功!")
else:
print("命令执行失败或超时!")

实践挑战

  • 如你所见,Envoy 是一个功能强大而又简洁的库。为了更好地掌握它,我提议你尝试以下几个练习:
  1. 尝试在你的 Python 脚本中用 Envoy 运行一些简单的系统命令。
  2. 设计一个命令序列并使用 Envoy 的管道功能来执行它们。
  3. 对于可能需要较长时间执行的命令,尝试加上超时参数,并处理超时情况。

总结

  • Envoy 库的设计理念是简化和人性化。它让执行系统命令变得像写 Python 代码一样自然流畅。

  • 虽然 Kenneth Reitz 还开发了 Delegator.py 作为 Envoy 的一个代替品,但 Envoy 依旧是一个很好的选择去执行系统命令和创建命令管道。

  • 花一点时间熟悉 Envoy,你会发现它或许正是你需要的。