玖叶教程网

前端编程开发入门

工作中使用python脚本——提前两小时回家见老婆(1)

大家好,我是一个黑眼圈极重的,怨气积满的,刚下班的程序猿。 哈哈,虽然我会python脚本,貌似也不能提前两小时回家,还得加班这么晚。。不过,今天要讲的知识,那可是实打实能提高大家工作效率的哟。希望大家多多关注我。。留言我,要不真不知道各位小哥哥小姐姐的品味,喜欢看啥样的。。

目前还是每周会更一篇openharmony 的源码走读解析,打算是从liteos_a 内核代码走读开始,其它就没啥确定主题了,有点想搞个python 系列,不知道大家喜不喜欢。。

所以,能关注的小伙伴要关注一把哟,留言我,你想学的,我都会,随时接受大家的考验,不会的话,emmm.....那就共同进步吧。

好的,言归正传,上期给大家介绍了,python 的os.path 库,主要是涉及一些文件,文件夹的路径获取,增删改查,chdir(切换文件路径等,哈哈,其实没讲,不过都归结为一类了)。

这期,准备给大家介绍下,在python脚本中,如何执行系统命令,特别是,大家平时的工作环境大多还是linux,所以本次在linux 上进行演示,python 如何执行linux 命令。

学会了这个,以后再也不用写那么难调试的shell脚本了,还那么乱糟糟的。

先给大家介绍下今天的演示环境,是一个wsl 的linux 虚拟机哈,装在我98年战损版的垃圾电脑上,装的还是老版本的ubuntu18.04。

一般来说,python执行linux 系统命令的方式有四种,

  1. 使用os.system 命令调用(不推荐,这种方式比较粗暴,同步进行,程序需要阻塞并返回,返回不依赖于python程序本身,而是依赖于操作系统,还存在跨平台问题(linux 和windows 下返回方式不一致)

下面给大家做个演示:

如上图,我们先导入os库,然后执行了最简单的 "ls -al " 查询当前文件夹的文件。

要注意这种调用方式无法保存调用结果,只适合那种不负责任,花心大罗卜,来一把就结束的。

  1. 使用commands 模块(在python3 已经废弃不再支持了,所以这里也不多介绍了,如果各位有维护老python2 的脚本,可以简单了解下
  2. 使用模块subprocess,这个是python 官方老推荐了的一种方式,而且你可以选择执行linux 命令后,把结果保存在什么地方,然后可以获取到执行命令的返回值等等各种信息,便于你做二次判断,正则匹配和加工处理等(正则表达式也是个坑,先挖了,后面讲),而且subprocess 听名字也听出来了,默认它是会在python中开启一个独立的子进程去执行shell脚本,然后返回执行结果,不会阻塞当前shell 进程,你也可以设置入参的shell = True强制让命令在shell中执行,但是官方不推荐。

函数原型是:

subprocess.run(args, *, stdin=None, input=None, 
  stdout=None, stderr=None, shell=False, timeout=None,
  check=False, encoding=None, errors=None)

功能:执行 args 参数所表示的命令,等待命令结束,
并返回一个 CompletedProcess 类型对象
其中,stdin, stdout 代表输入流和输出流,可指定,
shell 可设置为True和False,上面已经说过了。
这几个就是比较常用的用户自定义项了。

下面我们就着重介绍一下subprocess 这种方式:

大家从上图可以看到,实际上subprocess 的 run 方法,是返回了一个CompletedProcess 的对象的,后面大家就知道如何去获取结果了。

如上图,我们如果想获取subprocess 执行linux 命令的结果,直接把stdout参数设置为subprocess.PIPE, 输出就通过这个管道返回给ret变量了(如果不想要输出,可以设置为subprocess.DEVNULL),就相当于重定向到Linux /dev/null 垃圾箱无底洞差不多

我们可以使用ret.stdout 来获取原本应该打印在shell窗口上的结果。

关于subprocess我们就介绍到这,差不多够用了,然后我们看最后一个.

  1. os.popen 方式, 用于从一个命令打开一个管道,其实subprocess 也有类似的Popen功能,比这个还好用,因此这个其实也比较老了,不建议使用。有subprocess 基本可以应付日常百分之90以上的linux命令调用场景了。

使用方式如下:

os.popen(command[,mode[,bufsize]])
其中,command是linux命令字符串
mode 模式权限可以是'r'或者'w'
bufsize:
0 无缓冲
1 行缓冲
负值代表使用系统默认值
示例:
import os, sys
a = 'mkdir name_dir'
b= os.popen(a, 'r', 1)
print(b)

上面代码会打印返回值结果。

总结一下,大家还是尽量使用subprocess 方式进行命令调用,这是官方最推荐的使用方式,

subprocess 提供了强大的功能,输入输出和标准错误均可重定向到指定的流中,甚至是一个自己打开的文件中也是可以的。

然后提供了返回值获取等功能,可谓是无敌强大,综合了其它几种方式的所有优点,也没有其它模式存在的弊端。

最后,最后,大佬,小哥哥小姐姐们,求关注啊。。。关注啊,关注啊。。。也可以留言告诉我你们想听什么。。我随时在。。

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言