文章目录

  • 1、os.system
  • 2、os.popen(command,mode)
  • 3、subprocess模块
    • 3.1 subprocess.Popen()
    • 3.2 subprocess.call()
    • 3.3 subporcess.run()
    • 3.4 subprocess.getstatusoutput()
  • 4.实际用例

本文参考https://mp.weixin.qq.com/s/2XQKrKAUr54ER4SHwRYciQ,单纯为了学习理解

作为胶水语言,Python可以很方便的执行系统命令,Python3中常用的执行操作系统命令有os.system()、os.popen()、subprocess.popen()、subprocess.call()、subprocess.run()、subprocess.getstatusoutput()六种方法。 也就是说依赖于os和subprocess库,可以实现对linux系统命令的操作,并分别有两种和四种实现方法。下面依次查看.

1、os.system

system函数可以将字符串转化成命令在服务器上运行;其原理是每一条system函数执行时,其会创建一个子进程在系统上执行命令行,子进程的执行结果无法影响主进程。

其返回值是指令运行后返回的状态码,0表示指令成功执行,1表示失败,256表示没有返回结果,该方法适用于系统命令不需要输出内容的场景。

用法:

os.system("command")

示例:

import os
a=os.system("lsb_release -a")#用a接收返回值


当然还有其它类似命令:

import os
os.system("ls")
os.system("cd test && mkdir test1")

总之,可以在os.system中执行shell中通常可以执行的命令。

2、os.popen(command,mode)

这种调用方式是通过管道的方式来实现,这个函数的返回值是一个文件对象,可以读或者写(由mode决定,mode默认是’r’)。如果mode为’r’,调用该对象的read()或readlines()方法可以读取输出内容。

用法:

os.popen(command[, mode[, bufsize]])

os.system(cmd)或os.popen(cmd),前者返回值是脚本的退出状态码,后者的返回值是脚本执行过程中的输出内容。

a = os.popen("lsb_release -a")
print(a.read())
a= os.popen("ifconfig")
print(a.read())

3、subprocess模块

subprocess模块是python从2.4版本开始引入的模块,主要用来取代 一些旧的模块方法,如os.system、os.spawn、os.popen、commands.*等。官方推荐使用该模块执行系统命令,subprocess模块通过子进程来执行外部指令,并通过input/output/error管道,获取子进程的执行的返回信息。

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

3.1 subprocess.Popen()

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

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

常用参数说明:

示例:

from subprocess import PIPE,Popen
#返回的是Popen实例对像
proc = Popen('lsb_release -a',  # 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'))
print(outinfo.decode('utf-8'))  # 外部程序(linux系统)决定编码格式
print(errinfo.decode('utf-8'))

3.2 subprocess.call()

执行指定的命令, 返回命令执行状态, 功能类似os.system(cmd),参数shell默认为False
用法:

subprocess.call("command")

示例:

import subprocess
subprocess.call(["lsb_release","-a"])# 数组作为参数运行命令

3.3 subporcess.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(["lsb_release","-a"])
print('returncode:',completed.returncode)

3.4 subprocess.getstatusoutput()

执行cmd命令,返回一个元组(命令执行状态,命令执行结果输出)。

返回状态码和结果,0表示成功

示例:

import subprocess
ret, val = subprocess.getstatusoutput("lsb_release -a")
print(ret)
print(val)

4.实际用例

用python为开启的服务写一个守护进程。
定义一个每隔5秒就输出当前时间的python程序time.py

import time
while True:#输出年月日时分秒print(time.strftime('%Y/%m/%d %H:%M:%S',time.localtime(time.time())))time.sleep(5)

运行结果为:

此时,要写一个守护程序来检查这个时间程序是否在运行,如果没有要重新启动。具体会用到linux的ps命令:

ps aux | grep time.py |grep -v grep


所以用python来做就要执行shell命令:
可以这样,定义check.py:
用os.popen

import os
import timedef execCmd(cmd):r = os.popen(cmd)text = r.read()r.close()return text
while True:#检查程序是否在运行programIsRunningCmd = "ps -aux | grep time.py | grep -v grep"programIsRunningCmdAns = execCmd(programIsRunningCmd)#打印返回结果print(programIsRunningCmdAns)ansLine = programIsRunningCmdAns.split(' ')print(ansLine)# 判断打印结果if len(ansLine) > 2:print(time.strftime('%Y/%m/%d %H:%M:%S',time.localtime(time.time()))+"  time.py is running")#休息20秒,除低检查频率time.sleep(20)else:print("restarting time.py")os.system('nohup python time.py > time.log 2>&1 &')#0 表示stdin标准输入#1 表示stdout标准输出#2 表示stderr标准错误

check.py也要后台进行运行:

nohup python check.py > /dev/null 2>&1 &

/dev/null 表示输出空设备,不显示。

其它几个命令就不试了,按需进行深度研究吧。

实护程序如果换成shell脚本,check.sh:

while true;
doserver=`ps -aux | grep time.py | grep -v grep`if [ ! "$server" ]; then#echo "time.py挂了" | ./start.sh     echo "time.py挂了,进行重启" nohup python time.py > time.log 2>&1 &                      # breakfisleep 5
done

python调用系统命令的6种方法相关推荐

  1. python调用cmd命令释放端口_详解python调用cmd命令三种方法

    目前我使用到的python中执行cmd的方式有三种 使用os.system("cmd") 该方法在调用完shell脚本后,返回一个16位的二进制数,低位为杀死所调用脚本的信号号码, ...

  2. xlwings库 ==> Python调用VBA 的两种方法

    之前被问到,Python 很强大,但是需要单独安装,而VBA是office自带的, 那么两者结合的话,如何用Python调用VBA呢? 代码如下(其中 A 是测试文件 宏的名字): VBA代码: Su ...

  3. Python调用JS的四种方法

    Python调用JS的四种方法 1.PyExecJS 方法 1).安装PyExecJS 2). `PyExecJS 示例` 2.PyV8 方法 1).安装PyV8 2). `PyV8 示例` 3.js ...

  4. python cmd命令大全-详解python调用cmd命令三种方法

    目前我使用到的python中执行cmd的方式有三种 使用os.system("cmd") 该方法在调用完shell脚本后,返回一个16位的二进制数,低位为杀死所调用脚本的信号号码, ...

  5. 详解python运行三种方式_详解python调用cmd命令三种方法

    目前我使用到的python中执行cmd的方式有三种 使用os.system("cmd") 该方法在调用完shell脚本后,返回一个16位的二进制数,低位为杀死所调用脚本的信号号码, ...

  6. python调用cmd执行命令_详解python调用cmd命令三种方法

    目前我使用到的python中执行cmd的方式有三种 使用os.system("cmd") 该方法在调用完shell脚本后,返回一个16位的二进制数,低位为杀死所调用脚本的信号号码, ...

  7. Python执行系统命令的四种方法

    一.os.system方法 在子终端运行系统命令,可以获取命令执行后的返回信息以及执行返回的状态.执行后返回两行结果,第一行是结果, 第二行是执行状态信息,如果命令成功执行,这条语句返回0,否则返回1 ...

  8. python调用ping命令并输出ttl_详解Python调用系统命令的六种方法

    作为胶水语言,Python可以很方便的执行系统命令,Python3中常用的执行操作系统命令有os.system().os.popen().subprocess.popen().subprocess.c ...

  9. Python 复制文件的 9 种方法

    用 Python 复制文件的 9 种方法具体是: shutil copyfile() 方法 shutil copy() 方法 shutil copyfileobj() 方法 shutil copy2( ...

最新文章

  1. 刻意练习:LeetCode实战 -- Task21. 二叉树的最大深度
  2. python取出字符串中的偶数_从给定字符串中删除偶数个连续的重复字符
  3. 深度学总结:CNN Decoder, Upsampling的处理
  4. 传统公司部署OpenStack(t版)简易介绍(二)——Keystone组件部署
  5. 由浅入深剖析go channel
  6. 2.6.24及以上版本内核裁剪后启动黑屏的解决办法
  7. 用live555和ffplay搭建流媒体环境
  8. DIV背景半透明,DIV中的字不半透明
  9. 三校生计算机对口本科有哪些学校,宝山三校生五月对口高考报名
  10. vue-cli 脚手架移除、安装(最新版安装)、检测安装结果 - npm篇
  11. 《DSP using MATLAB》示例Example7.10
  12. Python基础----字符串
  13. 福昕阅读器3.1.3.1030破解方法
  14. ddr3ddr4 lpddr4速率_LPDDR4和LPDDR3性能差别多少 LPDDR4和LPDDR3参数对比
  15. Qwerty Learner:为键盘工作者设计的单词记忆与英语肌肉记忆锻炼网页
  16. c# MODBUS协议源码 上/下位机源码烧写Flash工具
  17. 【前端灵魂脚本语言JavaScript⑤】——JS中数组的使用
  18. 什么是SpringData
  19. NetBeans 界面美化与字体设置
  20. linux 查看文件创建时间

热门文章

  1. 前后端分离项目,vue+uni-app+php+mysql电影院售票小程序系统 开题报告
  2. 如何制作公众号二维码
  3. 数据结构-王道2017-绪论-1.1 数据结构的基本概念
  4. Spring Boot 教学 学习 讲义笔记 【入门到精通一篇就够了】(上)
  5. mysql 廖雪峰_廖雪峰大佬SQL教程学习笔记
  6. 树莓派 python spi_如何理解 Python_Spidev 的 spi.xfer2 方法? (时序图 位操作)
  7. acml 导航 melodic 发布2D nav goal 后 ,小车并不能沿着路径 global planner 走 古月居代码
  8. 18载艰苦创业,曾动念房地产转型,讯飞的江湖夜雨和桃李春风
  9. Java:实现简单的阻塞队列
  10. 略谈天若有情天亦老的下一句