日常整理python执行系统命令的常见方法(全)


Posted in Python onOctober 22, 2015

具体内容如下:

1 os.system

例如 ipython中运行如下命令,返回运行状态status

os.system('cat /etc/passwdqc.conf')
min=disabled,24,11,8,7
max=40
passphrase=3
match=4
similar=deny
random=47
enforce=everyone
retry=3
Out[6]: 0

2 os.popen()

popen(command [, mode='r' [, bufsize]]) -> pipe
Open a pipe to/from a command returning a file object.

运行返回结果

In [20]: output = os.popen('cat /proc/cpuinfo')
In [21]: lineLen = []
In [22]: for line in output.readlines():
    lineLen.append(len(line))
   ....:    
In [23]: line
line     lineLen 
In [23]: lineLen
Out[23]:
[14,
 25,
...

3 如何同时返回结果和运行状态,commands模块:

#String form: <module 'commands' from '/usr/lib64/python2.7/commands.pyc'>
File: /usr/lib64/python2.7/commands.py
Docstring:
Execute shell commands via os.popen() and return status, output.
Interface summary:
import commands
outtext = commands.getoutput(cmd)
(exitstatus, outtext) = commands.getstatusoutput(cmd)
outtext = commands.getstatus(file) # returns output of "ls -ld file"
A trailing newline is removed from the output string.
Encapsulates the basic operation:
pipe = os.popen('{ ' + cmd + '; } 2>&1', 'r')
text = pipe.read()
sts = pipe.close()

commands示例如下:

In [24]: (status, output) = commands.getstatusoutput('cat /proc/cpuinfo')
In [25]: status
Out[25]: 0
In [26]: len(output)
Out[26]: 3859

4 使用模块subprocess

ipython 中运行"?subprocess"可以发现subprocess是python用来替换os.popen()等管道操作命令的新模块

A more real-world example would look like this:

try:
 retcode = call("mycmd" + " myarg", shell=True)
 if retcode < 0:
  print >>sys.stderr, "Child was terminated by signal", -retcode
 else:
  print >>sys.stderr, "Child returned", retcode
except OSError, e:
 print >>sys.stderr, "Execution failed:", e

相对于上面几种方式,subprocess便于控制和监控进程运行结果,subprocess提供多种函数便于应对父进程对子进程不同要求:

4.1.1 subprocess.call()

父进程父进程等待子进程完成,返回exit code

4.1.2 subprocess.check_call()

父进程等待子进程完成,返回0,如果returncode不为0,则举出错误subprocess.CalledProcessError,该对象包含有returncode属性,可用try...except...来检查

4.1.3 subprocess.check_output()

父进程等待子进程完成

返回子进程向标准输出的输出结果

检查退出信息,如果returncode不为0,则举出错误subprocess.CalledProcessError,该对象包含有returncode属性和output属性,output属性为标准输出的输出结果,可用try...except...来检查

例如:

In [32]: out = subprocess.call("ls -l", shell=True)
total 42244
-rw-rw-r--.  1 *** ***     366 May 26 09:10 ChangeLog

4.2.1

上面三个函数都是源于Popen()函数的wapper(封装),如果需要更加个性化应用,那么就需要使用popen()函数

Popen对象创建后,主程序不会自动等待子进程完成。我们必须调用对象的wait()方法,父进程才会等待 (也就是阻塞block)

[wenwt@localhost syntax]$ rm subprocess.pyc 
[wenwt@localhost syntax]$ python process.py 
parent process
[wenwt@localhost syntax]$ PING www.google.com (173.194.219.99) 56(84) bytes of data.
^C
[wenwt@localhost syntax]$ 
--- www.google.com ping statistics ---
5 packets transmitted, 0 received, 100% packet loss, time 3999ms

加上wait方法:

[wenwt@localhost syntax]$ python process.py 
PING www.google.com (173.194.219.103) 56(84) bytes of data.
--- www.google.com ping statistics ---
5 packets transmitted, 0 received, 100% packet loss, time 3999ms
parent process

补充介绍:Python 执行终端命令的方法

import os
import subprocess
'''
os.system模块
os.system("ls -hl") 执行命令并返回状态码,当返回0表示成功;返回256表示失败,痛点是无法返回output
os.popen模块
os.popen("ls -hl") 执行命令,之后通过.read()方法获取output返回值
subprocess模块
subprocess.getstatusoutput("ls -hl") 执行命令,并返回状态status、输出output
subprocess.getoutput("ls -hl")    执行命令,只返回输出结果output
subprocess.call("ls -hl")      执行命令并返回状态码 和os.system("ls -hl")类似
'''
def test_system(cmd):
  status = os.system(cmd) # 会自动输出output到控制台 但是无法接收,status为0表示成功、status为256表示失败
  print(status)
def test_popen(cmd):
  output = os.popen(cmd).read() # 只会获取到命令的output,如果是有output的错误命令 会输出output,否则输出空白
  print(output)
def test_getoutput(cmd):
  output = subprocess.getoutput(cmd) # 和os.popen(cmd)类似
  print(output)
def test_getstatusoutput(cmd):
  status, output = subprocess.getstatusoutput(cmd) # 执行命令,并返回状态status、输出output
  print(status)
  print(output)
def test_call(cmd):
  status = subprocess.call(cmd) # 和os.system(cmd)类似
  print(status)
if __name__ == '__main__':
  # test_system('ls -lh') # test_system('test')
  # test_popen('pwd') # test_popen('test')
  # test_getoutput('pwd')
  # test_getstatusoutput('pwd')
  test_call('pwd')

以上内容就是本文的全部叙述,希望大家喜欢。

Python 相关文章推荐
利用python 更新ssh 远程代码 操作远程服务器的实现代码
Feb 08 Python
对python中array.sum(axis=?)的用法介绍
Jun 28 Python
python3利用tcp实现文件夹远程传输
Jul 28 Python
在Python中使用gRPC的方法示例
Aug 08 Python
解决python3 pika之连接断开的问题
Dec 18 Python
python3.8 微信发送服务器监控报警消息代码实现
Nov 05 Python
基于pytorch的lstm参数使用详解
Jan 14 Python
基于Python把网站域名解析成ip地址
May 25 Python
基于Python爬取股票数据过程详解
Oct 21 Python
python实现自定义日志的具体方法
May 28 Python
Python爬虫实战之爬取京东商品数据并实实现数据可视化
Jun 07 Python
bat批处理之字符串操作的实现
Mar 16 Python
Python六大开源框架对比
Oct 19 #Python
Python脚本暴力破解栅栏密码
Oct 19 #Python
python学习笔记之调用eval函数出现invalid syntax错误问题
Oct 18 #Python
在arcgis使用python脚本进行字段计算时是如何解决中文问题的
Oct 18 #Python
详解使用Python处理文件目录的相关方法
Oct 16 #Python
详解在Python程序中自定义异常的方法
Oct 16 #Python
Python编程中的文件操作攻略
Oct 16 #Python
You might like
常用的php对象类型判断
2008/08/27 PHP
使用php get_headers 判断URL是否有效的解决办法
2013/04/27 PHP
laravel 之 Eloquent 模型修改器和序列化示例
2019/10/17 PHP
js Html结构转字符串形式显示代码
2011/11/15 Javascript
整理8个很棒的 jQuery 倒计时插件和教程
2011/12/12 Javascript
js实现checkbox全选和反选示例
2014/05/01 Javascript
JS逆序遍历实现代码
2014/12/02 Javascript
基于jquery实现等比缩放图片
2014/12/03 Javascript
JavaScript引用类型和基本类型详解
2016/01/06 Javascript
JS中this上下文对象使用方式
2016/10/09 Javascript
JS常用函数和常用技巧小结
2016/10/15 Javascript
利用angularjs1.4制作的简易滑动门效果
2017/02/28 Javascript
从零开始做一个pagination分页组件
2017/03/15 Javascript
使用vue与jquery实时监听用户输入状态的操作代码
2017/09/19 jQuery
浅谈vuejs实现数据驱动视图原理
2018/02/23 Javascript
Node.js net模块功能及事件监听用法分析
2019/01/05 Javascript
jQuery表单元素过滤选择器用法实例分析
2019/02/20 jQuery
Vue Prop属性功能与用法实例详解
2019/02/23 Javascript
layui加载表格,绑定新增,编辑删除,查看按钮事件的例子
2019/09/06 Javascript
解决Vue-cli3没有vue.config.js文件夹及配置vue项目域名的问题
2020/12/04 Vue.js
Python学习思维导图(必看篇)
2017/06/26 Python
使用Python横向合并excel文件的实例
2018/12/11 Python
使用python爬取微博数据打造一颗“心”
2019/06/28 Python
Python为何不能用可变对象作为默认参数的值
2019/07/01 Python
Python字符串对象实现原理详解
2019/07/01 Python
python IDLE添加行号显示教程
2020/04/25 Python
Skyscanner新西兰:全球领先的旅游搜索网站
2019/08/26 全球购物
三好学生演讲稿范文
2014/04/26 职场文书
2015年个人实习工作总结
2014/12/12 职场文书
2014年终工作总结范本
2014/12/15 职场文书
2014年政教处工作总结
2014/12/20 职场文书
亮剑精神观后感
2015/06/05 职场文书
贫困证明书范文
2015/06/16 职场文书
党员反邪教心得体会
2016/01/15 职场文书
暑假开始了,你的暑假学习计划写好了吗?
2019/07/04 职场文书
python numpy中setdiff1d的用法说明
2021/04/22 Python