日常整理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利用装饰器进行运算的实例分析
Aug 04 Python
Python实现字典依据value排序
Feb 24 Python
Python Web框架Tornado运行和部署
Oct 19 Python
Python中运算符&quot;==&quot;和&quot;is&quot;的详解
Oct 08 Python
对numpy中布尔型数组的处理方法详解
Apr 17 Python
下载python中Crypto库报错:ModuleNotFoundError: No module named ‘Crypto’的解决
Apr 23 Python
Python实现多级目录压缩与解压文件的方法
Sep 01 Python
python修改txt文件中的某一项方法
Dec 29 Python
pycharm设置当前工作目录的操作(working directory)
Feb 14 Python
python使用QQ邮箱实现自动发送邮件
Jun 22 Python
Django REST Framework 分页(Pagination)详解
Nov 30 Python
python switch 实现多分支选择功能
Dec 21 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 处理上百万条的数据库如何提高处理查询速度
2010/02/08 PHP
php获取$_POST同名参数数组的实现介绍
2013/06/30 PHP
php实现遍历目录并删除指定文件中指定内容
2015/01/21 PHP
php 中奖概率算法实现代码
2017/01/25 PHP
Avengerls vs KG BO3 第二场2.18
2021/03/10 DOTA
js获取当前月的第一天和最后一天的小例子
2013/11/18 Javascript
js点击事件链接的问题解决
2014/04/25 Javascript
JavaScript开发人员的10个关键习惯小结
2014/12/05 Javascript
Javascript中的包装类型介绍
2015/04/02 Javascript
JavaScript控制网页层收起和展开效果的方法
2015/04/15 Javascript
js实现防止被iframe的方法
2015/07/03 Javascript
浅析javascript函数表达式
2016/02/10 Javascript
基于JS代码实现实时显示系统时间
2016/06/16 Javascript
JavaScript中${pageContext.request.contextPath}取值问题及解决方案
2016/12/08 Javascript
纯js实现倒计时功能
2017/01/06 Javascript
使用jQuery,Angular实现登录界面验证码详解
2017/04/27 jQuery
bootstrap daterangepicker汉化以及扩展功能
2017/06/15 Javascript
vue组件Prop传递数据的实现示例
2017/08/17 Javascript
Angular实现表单验证功能
2017/11/13 Javascript
浅谈微信JS-SDK 微信分享接口开发(介绍版)
2018/08/15 Javascript
vue项目部署到Apache服务器中遇到的问题解决
2018/08/24 Javascript
微信小程序导航栏滑动定位功能示例(实现CSS3的positionsticky效果)
2019/01/24 Javascript
angular4+百分比进度显示插件用法示例
2019/05/05 Javascript
简单介绍Python中的JSON模块
2015/04/08 Python
Python中逗号的三种作用实例分析
2015/06/08 Python
kaggle+mnist实现手写字体识别
2018/07/26 Python
python实现图片识别汽车功能
2018/11/30 Python
Python 窗体(tkinter)下拉列表框(Combobox)实例
2020/03/04 Python
Python基于模块Paramiko实现SSHv2协议
2020/04/28 Python
英国高档时尚男装购物网站:MR PORTER
2016/08/09 全球购物
杭州龙健科技笔试题.net部分笔试题
2016/01/24 面试题
科长竞争上岗演讲稿
2014/05/12 职场文书
2015年团支书工作总结
2015/04/03 职场文书
质量承诺书格式范文
2015/04/28 职场文书
房贷工资证明范本
2015/06/12 职场文书
pytorch 带batch的tensor类型图像显示操作
2021/05/20 Python