详解Python调用系统命令的六种方法
作者:吾非同 发布时间:2023-11-20 02:22:36
作为胶水语言,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=127192.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"...])
常用参数说明:
示例
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=5314.215.177.39 的 Ping 统计信息:
数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
最短 = 29ms,最长 = 30ms,平均 = 29ms
关于subprocess模块的具体用法,大家可以查看文档进行学习https://docs.python.org/3/library/subprocess.html。
来源:https://mp.weixin.qq.com/s?__biz=MzI5NzIyMjQwNA%3D%3D&chksm=ecb9347adbcebd6cdf9c48072dd88143e935945f13df48b2762dee5132cb29695d1dbf92a646&idx=2&mid=2247490577&scene=21&sn=66d12a79c0d2724f8a241c2198226a71#wechat_redirect


猜你喜欢
- 解决MySQL插入时间差八小时问题一般 jdbc url中 需要添加几个参数 , 大多数博客给的教程都是 useSSL=false&
- 大家知道,mailto是网页设计制作中的一个非常实用的html标签,许多拥有个人网页的朋友都喜欢在网站的醒目位置处写上自己的电子邮件地址,这
- QPixmap 像素图控件是用来处理图像的控件之一。它用于将优化后的图像显示在屏幕上。在我们的代码示例中,我们将使用QPixmap 控件在程
- 谈到“登录”,大多数人脑海中会立刻浮现出那个“两小框:一用户名,一密码,外加一按钮”的经典豆腐块, 这样的功能模块在互联网上屡见不鲜, 成为
- 本文和大家重点讨论一下Perl哈希表的概念,Perl语言和其他编程语言各有各的特点,这里和大家分享一下Perl哈希表的概念,其实Perl哈希
- 前言看到这篇文章我就默认你已经在你的电脑上使用 pipenv搭建好了虚拟环境并且设置好了开发环境(pycharm)。如果没有,请参照这篇文章
- 当用cmd命令行运行python文件时,我们知道可以通过>python pyfile.py来运行python文件,此时的输出会直接打印
- Python中内置了一些与时间处理相关的库,如time、datatime和calendar库。其中time库是Python中处理时间的标准库
- 数据库 属性 &nbs
- 适用环境: PHP5.2.x / mysql 5.0.xclass Mysql { priva
- 很多场景为了不阻塞,都需要异步回调机制。这是一个简单的例子,大家参考使用吧#!/usr/bin/env python# -*- coding
- [1]定义:正则又叫规则或模式,是一个强大的字符串匹配工具,在javascript中是一个对象[2]特性:[2.1]贪婪性,匹配最长的[2.
- 添加配置这里跟我们之前所说的appium测试工具的配置差不多。deviceName:设备名称platformName:测试平台platfor
- 场景:某台机器上有三块卡,想同时开三个程序,放到三块卡上去训练。策略:CUDA_VISIBLE_DEVICES=1 python train
- 一、ROC与AUC很多学习器是为了测试样本产生的一个实值或概率预测,然后将这个预测值与一个分类阈值(threshold)进行比较,若大于阈值
- 子组件监听父组件值变化子组件中利用watch监听父组件值的变化// 子组件props: ["a"], &nbs
- Node.js应用不需要经过编译过程,可以直接把源代码拷贝到部署机上执行,确实比C++、Java这类编译型应用部署方便。然而,Node.js
- 第一种, 使用create_connection链接,需要pip install websocket-client (此方法不建议使用,链接
- 使用python + shell 编写,是一个简易solaris系统巡检程序#!/usr/bin/python -u#-*- coding:
- 如下所示:file = open('./abc.csv')csv.reader(file, delimiter=',