详解Python调用系统命令的六种方法
本文详细解析Python中执行操作系统命令的六种常用方法,包括os.system、os.popen以及subprocess模块下的Popen、call、run和getstatusoutput。通过对比各方法的返回值、适用场景及代码示例,帮助开发者根据是否需要获取输出、处理标准输入输出或控制进程状态,选择最合适的调用方式。
作为一门胶水语言,Python能够便捷地执行系统命令。在Python3环境中,常用的执行操作系统命令的方法共有六种,分别是os.system()、os.popen()、subprocess.Popen()、subprocess.call()、subprocess.run()以及subprocess.getstatusoutput()。
os.system()
system函数能够将字符串转换为命令并在服务器上运行。其执行原理是:每次调用system函数时,都会创建一个子进程来执行系统命令行,且子进程的执行结果不会影响主进程。
该函数的返回值是指令运行后返回的状态码:0表示指令成功执行,1表示失败,256表示没有返回结果。此方法适用于系统命令不需要输出内容的场景。
用法:
os.system("command")
示例:
import os
a=os.system("ping 192.168.1.101") #使用a接收返回值
print(a)
输出:
正在 Ping 192.168.1.101 具有 32 字节的数据: 来自 192.168.1.101 的回复: 字节=32 时间=8ms TTL=127 来自 192.168.1.101 的回复: 字节=32 时间=2ms TTL=127 来自 192.168.1.101 的回复: 字节=32 时间=2ms TTL=127 来自 192.168.1.101 的回复: 字节=32 时间=2ms TTL=127
192.168.1.101 的 Ping 统计信息: 数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失), 往返行程的估计时间(以毫秒为单位): 最短 = 2ms,最长 = 8ms,平均 = 3ms 0 Process finished with exit code 0
也可以在linux系统下运行
import os
os.system('cd /home && mkdir test') 执行多条命令可以使用&&连接
os.popen(command,mode)
这种调用方式是通过管道来实现的,该函数的返回值是一个文件对象,可以进行读或写操作(由mode参数决定,mode默认值为'r')。如果mode为'r',调用该对象的read()或readlines()方法即可读取输出内容。
用法:os.popen(command[, mode[, bufsize]])
对比os.system(cmd)与os.popen(cmd),前者返回值是脚本的退出状态码,而后者的返回值是脚本执行过程中的输出内容。
import os
a=os.popen("ipconfig")
print(a.read())
输出: 以太网适配器 以太网:
连接特定的 DNS 后缀 . . . . . . . : 本地链接 IPv6 地址. . . . . . . . : fe81::b0ed:2b1b:7385:97d1%8 IPv4 地址 . . . . . . . . . . . . : 192.168.1.100 子网掩码 . . . . . . . . . . . . : 255.255.255.0 默认网关. . . . . . . . . . . . . : 192.168.1.1
subprocess模块
subprocess模块自Python 2.4版本引入,主要用于取代os.system、os.spawn、os.popen及commands.*等旧模块方法。官方推荐使用该模块执行系统命令,它通过子进程执行外部指令,并利用input/output/error管道获取子进程的执行返回信息。
其优势在于:通过对线程的控制和监控,将返回结果赋值给变量,从而便于程序后续处理。
subprocess.Popen()
使用Popen可以创建进程,并与进程进行复杂的交互操作。
用法:child = subprocess.Popen(["cmd","arg1"...])
常用参数说明:

示例
from subprocess import PIPE, Popen
# 返回的是 Popen 实例对象
proc = Popen(
'ipconfig', # cmd特定的查询空间的命令
stdin=None, # 标准输入 键盘
stdout=PIPE, # -1 标准输出(演示器、终端) 保存到管道中以便进行操作
stderr=PIPE, # 标准错误,保存到管道
shell=True)
# print(proc.communicate()) # 标准输出的字符串+标准错误的字符串
outinfo, errinfo = proc.communicate()
print(outinfo.decode('gbk')) # 外部程序(windows系统)决定编码格式
print(errinfo.decode('gbk'))
输出:
以太网适配器 以太网:
连接特定的 DNS 后缀 . . . . . . . : 本地链接 IPv6 地址. . . . . . . . : fe81::b0ed:2b1b:7385:97d1%8 IPv4 地址 . . . . . . . . . . . . : 192.168.1.100 子网掩码 . . . . . . . . . . . . : 255.255.255.0 默认网关. . . . . . . . . . . . . : 192.168.1.1
Process finished with exit code 0
subprocess.call()
执行指定的命令,并返回命令执行状态,功能类似于os.system(cmd),参数shell默认为False。
用法:subprocess.call("command")
# linux获取磁盘空间
import subprocess
subprocess.call(['df', '-h']) # 数组作为参数运行命令
输出: Filesystem Size Used Avail Use% Mounted on devtmpfs 909M 0 909M 0% /dev tmpfs 920M 32K 920M 1% /dev/shm tmpfs 920M 472K 919M 1% /run tmpfs 920M 0 920M 0% /sys/fs/cgroup /dev/vda1 50G 6.2G 41G 14% / tmpfs 184M 0 184M 0% /run/user/0
subprocess.run()
该函数新增于Python 3.5版本,用于执行指定命令,并等待命令执行完成后返回一个包含执行结果的CompletedProcess类的实例。run默认不会返回输出,仅返回命令执行状态。
用法:
subprocess.run(args, *, stdin=None, input=None, stdout=None, stderr=None, shell=False, timeout=None, check=False, universal_newlines=False)
import subprocess
completed = subprocess.run(['ls', '-1'])
print('returncode:', completed.returncode)
subprocess.getstatusoutput()
执行cmd命令,返回一个元组,包含(命令执行状态,命令执行结果输出)。
返回状态码和结果,0表示成功。
import subprocess
ret, val = subprocess.getstatusoutput("ping www.baidu.com")
print(ret)
print(val)
输出: 0
正在 Ping www.a.shifen.com [14.215.177.39] 具有 32 字节的数据: 来自 14.215.177.39 的回复: 字节=32 时间=29ms TTL=53 来自 14.215.177.39 的回复: 字节=32 时间=29ms TTL=53 来自 14.215.177.39 的回复: 字节=32 时间=29ms TTL=53 来自 14.215.177.39 的回复: 字节=32 时间=30ms TTL=53
14.215.177.39 的 Ping 统计信息: 数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失), 往返行程的估计时间(以毫秒为单位): 最短 = 29ms,最长 = 30ms,平均 = 29ms
关于subprocess模块的具体用法,大家可以查看文档进行学习https://docs.python.org/3/library/subprocess.html。
到此这篇关于详解Python调用系统命令的六种方法的文章就介绍到这了,更多相关Python调用系统命令内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













