日常整理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的Scrapy框架编写web爬虫的简单示例
Apr 17 Python
常见python正则用法的简单实例
Jun 21 Python
浅谈Python2.6和Python3.0中八进制数字表示的区别
Apr 28 Python
Python实现求笛卡尔乘积的方法
Sep 16 Python
python3使用scrapy生成csv文件代码示例
Dec 28 Python
int在python中的含义以及用法
Jun 27 Python
解决Python对齐文本字符串问题
Aug 28 Python
解决pycharm上的jupyter notebook端口被占用问题
Dec 17 Python
解决jupyter notebook打不开无反应 浏览器未启动的问题
Apr 10 Python
python 负数取模运算实例
Jun 03 Python
python中threading和queue库实现多线程编程
Feb 06 Python
Python数组变形的几种实现方法
May 30 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
crontab无法执行php的解决方法
2016/01/25 PHP
php PDO异常处理详解
2016/11/20 PHP
PHP实现数据库的增删查改功能及完整代码
2018/04/18 PHP
php的instanceof和判断闭包Closure操作示例
2020/01/26 PHP
网页常用特效代码整理
2006/06/23 Javascript
使用ngView配合AngularJS应用实现动画效果的方法
2015/06/19 Javascript
javascript图片预加载实例分析
2015/07/16 Javascript
JavaScript中setTimeout和setInterval函数的传参及调用
2016/03/11 Javascript
解决微信浏览器Javascript无法使用window.location.reload()刷新页面
2016/06/21 Javascript
AugularJS从入门到实践(必看篇)
2017/07/10 Javascript
微信小程序适配iphoneX的实现方法
2018/09/18 Javascript
对Layer弹窗使用及返回数据接收的实例详解
2019/09/26 Javascript
js实现select下拉框选择
2020/01/11 Javascript
vue fetch中的.then()的正确使用方法
2020/04/17 Javascript
ant design pro中可控的筛选和排序实例
2020/11/17 Javascript
js调用网络摄像头的方法
2020/12/05 Javascript
详解Python中的四种队列
2018/05/21 Python
numpy向空的二维数组中添加元素的方法
2018/11/01 Python
pyinstaller打包单个exe后无法执行错误的解决方法
2019/06/21 Python
CSS3解决移动页面上点击链接触发色块的问题
2016/06/03 HTML / CSS
20世纪40年代连衣裙和复古服装:The Seamstress Of Bloomsbury
2018/07/24 全球购物
香港零食网购:上仓胃子
2020/06/08 全球购物
优质飞蝇钓和渔具:RiverBum
2020/05/10 全球购物
介绍一下write命令
2012/09/24 面试题
客户代表实习人员自我鉴定
2013/09/27 职场文书
酒店公关部经理岗位职责
2013/11/24 职场文书
美德好少年事迹材料
2014/01/19 职场文书
党的群众路线教育实践活动公开承诺书
2014/03/28 职场文书
环境监测与治理技术专业求职信
2014/07/06 职场文书
班子查摆四风个人对照检查材料思想汇报
2014/10/04 职场文书
售后服务质量承诺书
2015/04/29 职场文书
民事诉讼答辩状范文
2015/05/21 职场文书
班主任开场白
2015/06/01 职场文书
导游词之杭州岳王庙
2019/11/13 职场文书
php字符串倒叙
2021/04/01 PHP
Spring Boot接口定义和全局异常统一处理
2022/04/20 Java/Android