Python 语言的灵活性和易用性,使得它非常适合作为“胶水”,去粘合各种系统命令(shell),完成复杂的运维工作和特殊场景的需求。本文主要介绍 Python 里如何调用执行 Linux 或 Windows 的系统命令(shell),方法主要有 system
、popen
、commands
和 subprocess
。
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 读取文件的操作很类似了,就连函数名都指明了这一点 open
和 popen
。
代码示例:
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)
以字符串的形式返回输出内容和状态码,即status
和output
。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的大门。
如果因为以上内容对你有所帮助,希望你能帮个忙,点个赞、评个论、转个发,关个注。
此公众号每周分享一篇干货文章,实实在在把一个课题说明白,讲清楚,望关注!
来源:CSDN
作者:周星星0_o
链接:https://blog.csdn.net/qq_39839807/article/details/104091069