日常整理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 linecache.getline()读取文件中特定一行的脚本
Sep 06 Python
Python中的装饰器用法详解
Jan 14 Python
Python写的Tkinter程序屏幕居中方法
Mar 10 Python
举例详解Python中循环语句的嵌套使用
May 14 Python
python开发之IDEL(Python GUI)的使用方法图文详解
Nov 12 Python
pytorch对可变长度序列的处理方法详解
Dec 08 Python
Pandas DataFrame数据的更改、插入新增的列和行的方法
Jun 25 Python
Python List列表对象内置方法实例详解
Oct 22 Python
简单了解Python3 bytes和str类型的区别和联系
Dec 19 Python
python读取Kafka实例
Dec 23 Python
python利用百度云接口实现车牌识别的示例
Feb 21 Python
jupyter notebook保存文件默认路径更改方法汇总(亲测可以)
Jun 09 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
thinkphp浏览历史功能实现方法
2014/10/29 PHP
php等比例缩放图片及剪切图片代码分享
2016/02/13 PHP
Yii框架getter与setter方法功能与用法分析
2019/10/22 PHP
深入浅析安装PhpStorm并激活的步骤详解
2020/09/17 PHP
JavaScript CSS修改学习第五章 给“上传”添加样式
2010/02/19 Javascript
无阻塞加载脚本分析[全]
2011/01/20 Javascript
jquery获取table中的某行全部td的内容方法
2013/03/08 Javascript
自定义jQuery选项卡插件实例
2013/03/27 Javascript
javascript强大的日期函数代码分享
2013/09/04 Javascript
javascript生成json数据简单示例分享
2014/02/14 Javascript
js完美解决IE6不支持position:fixed的bug
2015/04/24 Javascript
javascript实现保留两位小数的多种方法
2015/12/18 Javascript
jQuery实现TAB选项卡切换特效简单演示
2016/03/04 Javascript
js实现将json数组显示前台table中
2017/01/10 Javascript
ES6学习教程之对象字面量详解
2017/10/09 Javascript
vue 1.0 结合animate.css定义动画效果
2018/07/11 Javascript
vue中的适配px2rem示例代码
2018/11/19 Javascript
jquery操作checkbox的常用方法总结【附测试源码下载】
2019/06/10 jQuery
javascript实现评分功能
2020/06/24 Javascript
解决vue组件销毁之后计时器继续执行的问题
2020/07/21 Javascript
python中使用smtplib和email模块发送邮件实例
2014/04/22 Python
Python实现的Kmeans++算法实例
2014/04/26 Python
Tensorflow的可视化工具Tensorboard的初步使用详解
2018/02/11 Python
numpy concatenate数组拼接方法示例介绍
2019/05/27 Python
python如何使用代码运行助手
2020/07/03 Python
记一次高分屏下canvas模糊问题
2020/02/17 HTML / CSS
MADE法国:提供原创设计师家具
2018/09/18 全球购物
精伦电子Java笔试题
2013/01/16 面试题
数据员岗位职责
2013/11/19 职场文书
打架检讨书100字
2014/01/08 职场文书
大学生学习自我评价
2014/01/13 职场文书
机关领导查摆四风思想汇报
2014/09/13 职场文书
电工实训报告总结
2014/11/05 职场文书
2015年收银员个人工作总结
2015/04/01 职场文书
教师节班会主持词
2015/07/06 职场文书
html5调用摄像头实例代码
2021/06/28 HTML / CSS