日常整理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+Django在windows下的开发环境配置图解
Nov 11 Python
在Django的视图中使用数据库查询的方法
Jul 16 Python
玩转python爬虫之正则表达式
Feb 17 Python
详解Pytorch 使用Pytorch拟合多项式(多项式回归)
May 24 Python
Python API 自动化实战详解(纯代码)
Jun 11 Python
Python多叉树的构造及取出节点数据(treelib)的方法
Aug 09 Python
利用pandas将非数值数据转换成数值的方式
Dec 18 Python
Python with语句和过程抽取思想
Dec 23 Python
tensorflow 保存模型和取出中间权重例子
Jan 24 Python
Selenium自动化测试工具使用方法汇总
Jun 12 Python
Keras 数据增强ImageDataGenerator多输入多输出实例
Jul 03 Python
Python list去重且保持原顺序不变的方法
Apr 03 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
让你的网站首页自动选择语言转跳
2006/12/06 PHP
php判断手机访问还是电脑访问示例分享
2014/01/20 PHP
CI框架支持$_GET的两种实现方法
2016/05/18 PHP
PHP文件管理之实现网盘及压缩包的功能操作
2017/09/20 PHP
XML+XSL 与 HTML 两种方案的结合
2007/04/22 Javascript
JavaScript中两种链式调用实现代码
2011/01/12 Javascript
javascript中的throttle和debounce浅析
2014/06/06 Javascript
js给网页加上背景音乐及选择音效的方法
2015/03/03 Javascript
javascript中Math.random()使用详解
2015/04/15 Javascript
Javascript控制div属性动态变化实例分析
2015/10/08 Javascript
js中substr,substring,indexOf,lastIndexOf,split,replace的用法详解
2015/11/09 Javascript
如何解决jQuery EasyUI 已打开Tab重新加载问题
2016/12/19 Javascript
JavaScript数据结构之二叉树的查找算法示例
2017/04/13 Javascript
详解Vue2 SSR 缓存 Api 数据
2017/11/20 Javascript
详解vue-cli 本地开发mock数据使用方法
2018/05/29 Javascript
vue 解决循环引用组件报错的问题
2018/09/06 Javascript
js canvas实现画图、滤镜效果
2018/11/27 Javascript
关于vue-cli 3配置打包优化要点(推荐)
2019/04/22 Javascript
关于vue.js中实现方法内某些代码延时执行
2019/11/14 Javascript
Js实现粘贴上传图片的原理及示例
2020/12/09 Javascript
Python中MySQLdb和torndb模块对MySQL的断连问题处理
2015/11/09 Python
Python中类型检查的详细介绍
2017/02/13 Python
Python 自动刷博客浏览量实例代码
2017/06/14 Python
python如何派生内置不可变类型并修改实例化行为
2018/03/21 Python
解决sublime+python3无法输出中文的问题
2018/12/12 Python
python打开windows应用程序的实例
2019/06/28 Python
python安装和pycharm环境搭建设置方法
2020/05/27 Python
干部现实表现材料
2014/02/13 职场文书
关爱老人标语
2014/06/21 职场文书
新学期标语
2014/06/30 职场文书
代领毕业证委托书
2014/08/02 职场文书
2014年英语教学工作总结
2014/12/17 职场文书
2015年林业工作总结
2015/05/14 职场文书
结婚纪念日感言
2015/08/01 职场文书
2019年怎样才能撰写出优秀的自荐信
2019/03/25 职场文书
python中 .npy文件的读写操作实例
2022/04/14 Python