小编典典

如何在 Python 中实现常见的 bash 习语?

all

我目前通过一堆记不太清的 AWK、sed、Bash 和一点点 Perl 来处理我的文本文件。

我已经看到一些地方提到 python 对这种事情有好处。如何使用 Python 替换 shell 脚本、AWK、sed 和朋友?


阅读 69

收藏
2022-05-29

共1个答案

小编典典

任何 shell 都有几组特性。

  • 基本 Linux/Unix 命令。所有这些都可以通过子流程库获得。 这并不总是执行所有 外部命令的最佳首选。还可以在shutil中查看一些单独的Linux 命令,但您可能可以直接在您的Python 脚本中实现。os库中还有一大堆 Linux 命令;您可以在 Python 中更简单地完成这些操作。

还有——奖金! - 更快速。shell 中的每个单独的 Linux 命令(除了少数例外)都会派生一个子进程。通过使用
Pythonshutilos模块,您无需创建子进程。

  • shell 环境特性。这包括设置命令环境的东西(当前目录和环境变量等等)。您可以直接从 Python 轻松管理它。

  • Shell 编程功能。这是所有进程状态代码检查、各种逻辑命令(if、while、for 等)、测试命令及其所有相关命令。函数定义的东西。这在 Python 中要容易得多。这是摆脱 bash 并在 Python 中实现的巨大胜利之一。

  • 交互功能。这包括命令历史记录和其他内容。您不需要它来编写 shell 脚本。这仅用于人机交互,不适用于脚本编写。

  • shell 文件管理功能。这包括重定向和管道。这更棘手。其中大部分可以通过子流程完成。但是一些在 shell 中容易做的事情在 Python 中是不愉快的。特别像(a | b; c ) | something >result. 这将并行运行两个进程(输出a作为 的输入b),然后是第三个进程。该序列的输出与并行运行,something并将输出收集到一个名为result. 用任何其他语言来表达都是很复杂的。

特定程序(awk、sed、grep 等)通常可以重写为 Python 模块。不要过火。替换您需要的并改进您的“grep”模块。不要一开始就编写一个
Python 模块来代替“grep”。

最好的事情是您可以分步执行此操作。

  1. 用 Python 替换 AWK 和 PERL。别管其他一切。
  2. 看看用 Python 替换 GREP。这可能有点复杂,但您的 GREP 版本可以根据您的处理需求进行定制。
  3. 查看将 FIND 替换为使用os.walk. 这是一个巨大的胜利,因为您不会产生尽可能多的进程。
  4. 看看用 Python 脚本替换常见的 shell 逻辑(循环、决策等)。
2022-05-29