详解Python调用系统命令的六种方法


Posted in Python onJanuary 28, 2021

作为胶水语言,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.*等。官方推荐使用该模块执行系统命令,subprocess模块通过子进程来执行外部指令,并通过input/output/error管道,获取子进程的执行的返回信息。

好处在于:运用对线程的控制和监控,将返回的结果赋于一变量,便于程序的处理。

subprocess.Popen()

使用Popen可以创建进程,并与进程进行复杂的交互。

用法:child = subprocess.Popen(["cmd","arg1"...])

常用参数说明:

详解Python调用系统命令的六种方法

示例

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()

python3.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调用系统命令内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python实现 多进程导入CSV数据到 MySQL
Feb 26 Python
使用tensorflow实现AlexNet
Nov 20 Python
Python中判断输入是否为数字的实现代码
May 26 Python
Python基础教程之异常详解
Jan 10 Python
wxPython实现文本框基础组件
Nov 18 Python
numpy按列连接两个维数不同的数组方式
Dec 06 Python
Python实现非正太分布的异常值检测方式
Dec 09 Python
python调用c++返回带成员指针的类指针实例
Dec 12 Python
python用opencv 图像傅里叶变换
Jan 04 Python
python中使用asyncio实现异步IO实例分析
Feb 26 Python
Python超简单容易上手的画图工具库推荐
May 10 Python
Python天气语音播报小助手
Sep 25 Python
教你一分钟在win10终端成功安装Pytorch的方法步骤
Jan 28 #Python
详解win10下pytorch-gpu安装以及CUDA详细安装过程
Jan 28 #Python
Python中Pyspider爬虫框架的基本使用详解
Jan 27 #Python
Python3 + Appium + 安卓模拟器实现APP自动化测试并生成测试报告
Jan 27 #Python
一个入门级python爬虫教程详解
Jan 27 #Python
python+selenium爬取微博热搜存入Mysql的实现方法
Jan 27 #Python
Python实现网络聊天室的示例代码(支持多人聊天与私聊)
Jan 27 #Python
You might like
php中file_get_content 和curl以及fopen 效率分析
2014/09/19 PHP
轻轻松松学习JavaScript
2007/02/25 Javascript
仿校内登陆框,精美,给那些很厉害但是没有设计天才的程序员
2008/11/24 Javascript
JS在IE和FireFox之间常用函数的区别小结
2010/03/12 Javascript
基于jQuery实现的Ajax 验证用户名是否存在的实现代码
2011/04/06 Javascript
JavaScript 高级篇之闭包、模拟类,继承(五)
2012/04/07 Javascript
js动画(animate)简单引擎代码示例
2012/12/04 Javascript
判断js中各种数据的类型方法之typeof与0bject.prototype.toString讲解
2013/11/07 Javascript
jQuery封装的tab选项卡插件分享
2015/06/16 Javascript
字太多用...代替的方法(两种)
2017/03/15 Javascript
JS模拟超市简易收银台小程序代码解析
2017/08/18 Javascript
zTree jQuery 树插件的使用(实例讲解)
2017/09/25 jQuery
Vue打包后出现一些map文件的解决方法
2018/02/13 Javascript
详解Chart.js轻量级图表库的使用经验
2018/05/22 Javascript
JS重学系列之聊聊new操作符
2019/03/04 Javascript
JavaScript解析机制与闭包原理实例详解
2019/03/08 Javascript
JavaScript 实现自己的安卓手机自动化工具脚本(推荐)
2020/05/13 Javascript
[48:29]2018DOTA2亚洲邀请赛3月30日 小组赛A组 LGD VS KG
2018/03/31 DOTA
python网络编程之读取网站根目录实例
2014/09/30 Python
Python模拟登陆实现代码
2017/06/14 Python
Python实现获取邮箱内容并解析的方法示例
2018/06/16 Python
jupyter notebook 参数传递给shell命令行实例
2020/04/10 Python
Django实现celery定时任务过程解析
2020/04/21 Python
django 数据库返回queryset实现封装为字典
2020/05/19 Python
使用keras内置的模型进行图片预测实例
2020/06/17 Python
pytest fixtures装饰器的使用和如何控制用例的执行顺序
2021/01/28 Python
伦敦高级内衣品牌:Agent Provocateur(大内密探)
2016/08/23 全球购物
摩托车和ATV零件、配件和服装的首选在线零售商:MotoSport
2017/12/22 全球购物
北欧最好的童装网上商店:Babyshop
2019/09/15 全球购物
Bonprix法国:时尚、鞋子、家居
2020/12/29 全球购物
销售团队口号大全
2014/06/06 职场文书
我的中国梦演讲稿500字
2014/08/19 职场文书
2015纪念九一八事变84周年演讲稿
2015/03/19 职场文书
交心谈心活动总结
2015/05/11 职场文书
结婚纪念日感言
2015/08/01 职场文书
MySQL存储过程及语法详解
2022/08/05 MySQL