在Python里调用执行Linux或Windows系统的shell命令:system、popen、commands、subprocess

旧巷老猫 提交于 2020-01-27 14:14:59

Python 语言的灵活性和易用性,使得它非常适合作为“胶水”,去粘合各种系统命令(shell),完成复杂的运维工作和特殊场景的需求。本文主要介绍 Python 里如何调用执行 Linux 或 Windows 的系统命令(shell),方法主要有 systempopencommandssubprocess

system

os.system(cmd),这个方法使用起来最直接,是 同步 执行,会 阻塞 进程。所以,在需要返回结果的场景中,这个方法是最合适的。

但需要注意的是,其只返回执行得状态码(依赖于操作系统),其值为 int 类型,0 表示 shell 执行成功,256 则表示未找到命令。(状态码 Linux 和 Windows 是不一样的)

代码示例:

import os

status_code = os.system('uptime')
print('status_code:', status_code)

status_code: 0

popen

os.popen(cmd [,mode [,bufsize]]),这个方法是以文件的形式返回 shell 命令执行后的结果,也是 同步 执行,会 阻塞 进程。

但与 os.system 的返回值不同,os.popen 通过 read()readlines() 等方法获得命令输出内容(不是状态码啦)。

当执行时,调用 close() 不返回任何值,而失败时,会返回对应的状态码。

这和 Python 读取文件的操作很类似了,就连函数名都指明了这一点 openpopen

代码示例:

import os

process = os.popen('uptime')
print(process.read())
process.close()

08:21:34 up 36 min,  2 users,  load average: 0.30, 0.20, 0.10

commands

commands,这个方法是专门为了调用系统命令(shell)而存在的模块,提供了三种不同的方法:

  • commands.getstatusoutput(cmd) 以字符串的形式返回输出内容和状态码,即 statusoutput
  • commands.getoutput(cmd) 只返回输出的内容。
  • commands.getstatus(cmd) 只返回状态码。

但在 Python3 中,commands 已经 不推荐 使用了,大家大概了解一下就可以了,这里就不给出代码示例了。

subprocess

subprocess,这个方法目前是 Python3 最为 推荐 的方法,使用起来也相当简单,允许创建多个子进程,所以,适用于 异步非阻塞 的场景,可以间接实现 Python 的多进程模式(同时启动多个 Python 脚本)

主要提供了如下的方法:

  • subprocess.call() 父进程等待子进程完成,返回状态码。
  • subprocess.check_call() 父进程等待子进程完成,返回 0 ,如果不为 0 ,则抛出异常 subprocess.CalledProcessError
  • subprocess.check_output() 同样等待子进程完成,返回子进程的标准输出内容,如果不成功,则抛出异常 subprocess.CalledProcessError
  • subprocess.Popen() 其实上面三个函数都是基于 Popen 的封装实现的,为了我们方便使用,绝大多钱情况下,我们使用上面三种函数即可。

代码示例:

import subprocess

result = subprocess.check_output(['echo', 'Hello World'])
print(result)

Hello World!

这里需要注意的是,调用的 shell 命令的形式是 list ,并不是字符串,所以,如果遇到较长的命令时,推荐 使用 shlex 模块,可以帮助格式化命令。

代码示例:

import subprocess
import shlex

cmd = shlex.split('ls -l')
status = subprocess.call(cmd)
print(status)

0

最后,安利大家一本书《深入理解NLP的中文分词:从原理到实践》,让你从零掌握中文分词技术,踏入NLP的大门。

如果因为以上内容对你有所帮助,希望你能帮个忙,点个赞、评个论、转个发,关个注。

此公众号每周分享一篇干货文章,实实在在把一个课题说明白,讲清楚,望关注!
惠惠周刊

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!