日常整理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中列表和元组的使用方法和区别详解
Dec 30 Python
python 截取 取出一部分的字符串方法
Mar 01 Python
python随机数分布random测试
Aug 27 Python
Python Tkinter 简单登录界面的实现
Jun 14 Python
Win10下Python3.7.3安装教程图解
Jul 08 Python
简单易懂Pytorch实战实例VGG深度网络
Aug 27 Python
Python中有几个关键字
Jun 04 Python
详解python logging日志传输
Jul 01 Python
Python 发送邮件方法总结
Aug 10 Python
python读取图片颜色值并生成excel像素画的方法实例
Feb 19 Python
用Python简陋模拟n阶魔方
Apr 17 Python
Python实现批量将文件复制到新的目录中再修改名称
Apr 12 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之第五天
2006/10/09 PHP
Yii框架调试心得--在页面输出执行sql语句
2014/12/25 PHP
PHP 文件锁与进程锁的使用示例
2017/08/07 PHP
php+redis实现商城秒杀功能
2020/11/19 PHP
PHP长连接实现与使用方法详解
2018/02/11 PHP
Laravel用户授权系统的使用方法示例
2018/09/16 PHP
Laravel获取所有的数据库表及结构的方法
2019/10/10 PHP
浅谈laravel框架与thinkPHP框架的区别
2019/10/23 PHP
2020最新版 PhpStudy V8.1版本下载安装使用详解
2020/10/30 PHP
基于jQuery实现下拉收缩(展开与折叠)特效
2012/12/25 Javascript
获取下拉列表框的值是数组,split,$.inArray示例
2013/11/13 Javascript
获取3个数组不重复的值的具体实现
2013/12/30 Javascript
手机端点击图片放大特效PhotoSwipe.js插件实现
2016/08/24 Javascript
原生JS轮播图插件
2017/02/09 Javascript
layui实现form表单同时提交数据和文件的代码
2019/10/25 Javascript
[01:31:22]DOTA2-DPC中国联赛定级赛 LBZS vs Magma BO3第二场 1月10日
2021/03/11 DOTA
Python使用py2exe打包程序介绍
2014/11/20 Python
Python 装饰器深入理解
2017/03/16 Python
Python爬虫DNS解析缓存方法实例分析
2017/06/02 Python
python shell根据ip获取主机名代码示例
2017/11/25 Python
Python3获取拉勾网招聘信息的方法实例
2019/04/03 Python
Django后端接收嵌套Json数据及解析详解
2019/07/17 Python
简单了解python 邮件模块的使用方法
2019/07/24 Python
Python代码覆盖率统计工具coverage.py用法详解
2020/11/25 Python
一款利用html5和css3实现的3D滚动特效的教程
2015/01/04 HTML / CSS
PREMIUM-MALL法国:行李、箱包及配件在线
2019/05/30 全球购物
办公文员的工作岗位职责
2013/11/12 职场文书
企业宣传方案
2014/03/04 职场文书
2014两会学习心得:时代的发展
2014/03/17 职场文书
付款委托书范本
2014/04/04 职场文书
商务英语专业求职信
2014/06/26 职场文书
课外访万家心得体会
2014/09/03 职场文书
银行员工犯错检讨书
2014/09/16 职场文书
幼儿园大班毕业评语
2014/12/31 职场文书
中考学习决心书
2015/02/04 职场文书
2015年司法所工作总结
2015/04/27 职场文书