当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何在Python中实现常见的bash习语?》经验,为你挑选了10个好方法。

我目前通过一堆记忆错误的AWK,sed,Bash和一小部分Perl进行文本文件操作.

我已经看到过一些地方,python很适合这种事情.我如何使用Python来替换shell脚本,AWK,sed和朋友?



1> S.Lott..:

任何shell都有几组功能.

Essential Linux/Unix命令.所有这些都可以通过子进程库获得.这并不总是执行所有外部命令的最佳选择.另请参阅shutil,了解一些单独的Linux命令命令,但您可以直接在Python脚本中实现.另一大批Linux命令在os库中; 你可以在Python中更简单地完成这些.

而且 - 奖金! - 更快速.shell中的每个单独的Linux命令(除了少数例外)都会分叉子进程.通过使用Python shutilos模块,您不需要分叉子进程.

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"模块.不要开始编写替换"grep"的Python模块.

最好的是你可以分步完成.

    用Python替换AWK和PERL.别管其他一切.

    看看用Python替换GREP.这可能有点复杂,但您的GREP版本可以根据您的处理需求进行定制.

    看看使用Python循环替换FIND os.walk.这是一个很大的胜利,因为你不会产生尽可能多的进程.

    看看用Python脚本替换常见的shell逻辑(循环,决策等).


我真诚地希望人们完全放弃shell脚本.我知道黑客在*nix世界中实际上是一种宗教,但我真的厌倦了试图解释植入操作系统中的所有hackish变通方法.微型工具(awk,sed,top,base等)的新颖性让每个人都决定推出自己的版本.当我想象在蹩脚的小工具上浪费了大量的工时时,我会感到畏缩,这些小工具很容易被一些设计精良的Python模块取代.::叹::
我不同意@EvanPlaice,因为我所拥有的几个`find`脚本的python版本是丑陋的,长而且不可维护.很多东西*应该是*shell脚本,许多其他*不应该*.并非所有东西都只需要Python或BASH(或其他任何东西).
@mikebabcock理想情况下,会有一个完整的库来实现基本*nix堆栈提供的所有微工具.将包括find()和last()之类的函数,而不是管道,currying和lazy-loaded的组合将把它们粘合在一起.拥有一个在所有发行版中以标准方式工作的POSIX脚本环境不是很好吗?没有这样的东西存在,但......
写道:"交互功能.这包括命令历史和什么不.你不需要这个." 我担心没有人能分辨出一个人真正需要什么.也许他做到了.此外,这些设施在交互式shell中很有意义,以Idle和IPython之间的区别为例.
关于shell管道(例如`(a | b; c)| something> result`)的观点有所缓解,因为使用`shell = True`将shell管道传递给`subprocess`方法非常容易.
@mikebabcock _很多东西都应该是shell脚本,其他很多都不应该.并非所有东西都只需要Python或BASH(或其他任何东西).所以shell脚本必须用Bash编写.

2> Piotr Dobrog..:

当然是 :)

看看这些帮助你的库永远不要再编写shell脚本(Plumbum的座右铭).

中士

SH

另外,如果你想用基于Python的东西替换awk,sed和grep,那么我推荐pyp -

"Pyed Piper"或pyp是一个类似于awk或sed的linux命令行文本操作工具,但它使用标准的python字符串和列表方法以及自定义函数,这些函数经过演变,可以在激烈的生产环境中生成快速结果.



3> 小智..:

我刚刚发现了如何结合bash和ipython的最佳部分.到目前为止,这对我来说比使用子进程等更舒服.您可以轻松复制现有bash脚本的大部分内容,例如以python方式添加错误处理:)这是我的结果:

#!/usr/bin/env ipython3

# *** How to have the most comfort scripting experience of your life ***
# ######################################################################
#
# … by using ipython for scripting combined with subcommands from bash!
#
# 1. echo "#!/usr/bin/env ipython3" > scriptname.ipy    # creates new ipy-file
#
# 2. chmod +x scriptname.ipy                            # make in executable
#
# 3. starting with line 2, write normal python or do some of
#    the ! magic of ipython, so that you can use unix commands
#    within python and even assign their output to a variable via
#    var = !cmd1 | cmd2 | cmd3                          # enjoy ;)
#
# 4. run via ./scriptname.ipy - if it fails with recognizing % and !
#    but parses raw python fine, please check again for the .ipy suffix

# ugly example, please go and find more in the wild
files = !ls *.* | grep "y"
for file in files:
  !echo $file | grep "p"
# sorry for this nonsense example ;)

请参阅有关系统shell命令的 IPython文档,并将其用作系统shell.


Upvoted是因为出于某些奇怪的原因,没有人提到过! - IPython中的命令,这绝对是关键; 特别是因为您还可以将其输出分配给变量(行列表),如`filelines =!cat myfile`

4> 小智..:

截至2015年和Python 3.4的发布,现在有一个相当完整的用户交互式shell可用于:http://xon.sh/或https://github.com/scopatz/xonsh

该演示视频不显示正在使用的管道,但他们在默认的shell模式下支持.

Xonsh('conch')非常努力地模仿bash,所以你已经获得了肌肉记忆的东西,比如

env | uniq | sort -r | grep PATH

要么

my-web-server 2>&1 | my-log-sorter

仍然可以正常工作.

该教程非常冗长,似乎涵盖了人们在灰烬或bash提示下通常会遇到的大量功能:

编译,评估和执行!

命令历史记录和选项卡完成

帮助和超级帮助?&??

别名和定制提示

执行*.xsh也可以导入的命令和/或脚本

环境变量包括Lookup with ${}

输入/输出重定向和组合

后台工作和工作控制

嵌套子进程,管道和协处理

存在命令时的子进程模式,否则为Python模式

捕获子进程,带有未捕获的子进程$(),带有$[]Python评估@()

Filename Globbing with *或Regular Expression Filename Globbing with Backticks



5> Mapad..:

如果你想使用Python作为shell,为什么不看看IPython?交互式学习语言也很好.

如果你做了很多文本操作,并且你使用Vim作为文本编辑器,你也可以直接在python中为Vim编写插件.只需在Vim中键入":help python"并按照说明操作或查看此演示文稿.编写将在编辑器中直接使用的函数非常简单和强大!


有一个名为'sh'的ipython配置文件使得解释器*非常像shell.
ipython'sh'配置文件已被删除一段时间了.

6> 小智..:

在开始时有sh,sed和awk(并找到,和grep,和...).这很好.但awk可能是一个奇怪的小野兽,如果你不经常使用它,很难记住.然后伟大的骆驼创造了Perl.Perl是系统管理员的梦想.这就像类固醇的shell脚本.文本处理,包括正则表达式只是语言的一部分.然后它变得丑陋......人们试图用Perl做大的应用程序.现在,不要误会我的意思,Perl可以是一个应用程序,但如果你不是很小心,它可以(可以!)看起来像一团糟.然后就是所有这些平面数据业务.这足以让程序员疯狂.

输入Python,Ruby等.这些是非常好的通用语言.它们支持文本处理,并且做得很好(尽管可能没有与语言的基本核心紧密缠绕在一起).但是它们也可以非常好地扩展,并且在一天结束时仍然具有漂亮的代码.他们还开发了相当庞大的社区,其中包含大量的图书馆.

现在,对Perl的大部分负面意见都是一个问题,当然有些人可以编写非常简洁的Perl,但是有很多人抱怨创建混淆代码太容易了,你知道有一些真相.问题真的变成了,你是否会将这种语言用于简单的bash脚本替换.如果没有,请学习更多Perl ..这绝对是太棒了.另一方面,如果你想要一种与你一起成长的语言,你可以建议使用Python或Ruby.

无论哪种方式,祝你好运!



7> Dan Lenski..:

我推荐了很棒的在线书籍Dive Into Python.这就是我最初学习语言的方式.

除了教你语言的基本结构,以及大量有用的数据结构之外,它还有一个关于文件处理和后续章节的正确表达式的章节等等.



8> Federico A. ..:

添加到先前的答案:检查pexpect模块以处理交互式命令(adduser,passwd等)



9> Hal Canary..:

我喜欢Python的一个原因是它比POSIX工具更加标准化.我必须加倍检查并检查每个位是否与其他操作系统兼容.在Linux系统上编写的程序在OSX的BSD系统上可能无法正常工作.使用Python,我只需要检查目标系统是否具有足够现代的Python版本.

更好的是,用标准Python编写的程序甚至可以在Windows上运行!



10> Germán Diago..:

我将根据经验给出我的意见:

对于shell:

shell可以很容易地生成只读代码.写下来,当你回到它时,你永远不会弄明白你又做了什么.实现这一目标非常容易.

shell可以用管道在一行中做很多文本处理,拆分等.

在将程序调用集成到不同的编程语言中时,它是最好的粘合语言.

对于python:

如果你想要包含窗口的可移植性,使用python.

当你必须操作比文本更多时,python可以更好,例如数字集合.为此,我推荐python.

我通常会选择bash来处理大部分事情,但是当我有一些必须跨越窗口的东西时,我只使用python.

推荐阅读
kikokikolove
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有