Python常用外部指令执行代码实例


Posted in Python onNovember 05, 2020

1、os.system()

阻塞

屏幕会打印命令的输出

返回命令结果码

# -*- encoding=utf-8 -*-
import os
if __name__ == '__main__':
  pass
  print('开始')
  ret1 = os.system('python')
  print('ret1:{}'.format(ret1))
  ret2 = os.system('java -version')
  print('ret2:{}'.format(ret2))
  print('结束')

运行

Python常用外部指令执行代码实例

可能有人理解阻塞是因为运行了python,因此我尝试两个命令都用java -version

# -*- encoding=utf-8 -*-

import os

if __name__ == '__main__':
  pass
  print('开始')
  ret1 = os.system('java -version')
  print('ret1:{}'.format(ret1))
  ret2 = os.system('java -version')
  print('ret2:{}'.format(ret2))
  print('结束')

运行

Python常用外部指令执行代码实例

2、os.popen()

阻塞或不阻塞

屏幕不会打印出命令的输出

返回文件对象,可用read,readline读取

不阻塞时:

# -*- encoding=utf-8 -*-
import os
if __name__ == '__main__':
  pass
  print('开始')
  os.popen('python')
  ret2 = os.popen('java -version')
  print('结束')

运行(程序很快打印开始和结束,就像只用了两个print语句一样快)

Python常用外部指令执行代码实例

阻塞时:

# -*- encoding=utf-8 -*-
import os
if __name__ == '__main__':
  pass
  print('开始')
  ret1 = os.popen('python')
  print(ret1.read())
  ret2 = os.popen('java -version')
  print(ret2.read())
  print('结束')

运行

Python常用外部指令执行代码实例

3、commands.getstatusoutput

python2.+中使用

需要到linux运行

阻塞或者非阻塞

屏幕不会打印出命令的输出

非阻塞时

# -*- encoding=utf-8 -*-
import commands
if __name__ == '__main__':
  pass
  print('开始')
  ret1 = commands.getstatusoutput('python')
  ret2 = commands.getstatusoutput('java -version')
  print('结束')

运行

Python常用外部指令执行代码实例

阻塞时:

# -*- encoding=utf-8 -*-
import commands
if __name__ == '__main__':
  pass
  print('开始')
  ret1 = commands.getstatusoutput('python')
  print ret1[0]
  print ret1[1]
  print '=============='
  ret2 = commands.getstatusoutput('java -version')
  print ret2[0]
  print ret2[1]
  print '=============='
  print('结束')

运行

Python常用外部指令执行代码实例

4、subprocess中Popen

阻塞或非阻塞,同上面一样,通过是否读取IO决定是否阻塞

屏幕会打印出命令的输出

可通过stdout,stderr参数指定输出或错误打印到文件

# -*- encoding=utf-8 -*-
import subprocess
if __name__ == '__main__':
  pass
  print('开始')
  s1 = subprocess.Popen('python')
  s1.wait()
  s2 = subprocess.Popen('java -version')
  s2.wait()
  print('结束')

运行

Python常用外部指令执行代码实例

4.1、 输出到文件

通过文件对象来输出到文件中

# -*- encoding=utf-8 -*-
import subprocess
if __name__ == '__main__':
  pass
  print('开始')
  with open('s1.txt', 'w') as f:
    s1 = subprocess.Popen('python', stdout=f, ) # 指定输出重定向到文件
    s1.wait(10) # 超过10秒还没执行完会抛出异常
  with open('s2.txt', 'w') as f:
    s2 = subprocess.Popen('java -version', stdout=f, stderr=f) # 指定输出和错误都重定向到文件
    s2.wait()
  print('结束')

运行后可看到文件已经写入,屏幕不打印。需要注意是stdout还是stderr。

4.2、捕获输出和错误

PIPE通过开一个新的管道来接收运行状态

# -*- encoding=utf-8 -*-

import subprocess

if __name__ == '__main__':
  pass
  print('开始')
  s1 = subprocess.Popen('java -version', stdout=subprocess.PIPE, stderr=subprocess.PIPE)
  s1.wait(10) # 超过10秒还没执行完会抛出异常
  print(s1.returncode) # 结果码
  print(s1.poll()) # 已经执行结束返回结果码,否则返回None
  std1 = s1.stdout.read()
  print('std_out:{}'.format(std1))
  std2 = s1.stderr.read()
  print('std_err:{}'.format(std2))
  print('结束')

运行

Python常用外部指令执行代码实例

5、subprocess.call

用来替代os.system

阻塞

# -*- encoding=utf-8 -*-
import subprocess
if __name__ == '__main__':
  pass
  print('开始')
  s1 = subprocess.call('java -version', )
  print(s1)
  s2 = subprocess.call('python', )
  print(s2)
  s3 = subprocess.call('python', timeout=3) # 超时抛出异常
  print(s3)
  print('结束')

6、check_call()和check_output()

都会检查结果码,不是0就抛出异常

check_call()返回状态码

check_output()返回输出

# -*- encoding=utf-8 -*-
import subprocess
if __name__ == '__main__':
  pass
  print('开始')
  s1 = subprocess.check_call('java -version', )
  print(s1)
  s2 = subprocess.check_output('java -version', )
  print(s2)
  print('结束')

运行

Python常用外部指令执行代码实例

使用上面提到的三个方法:call()、check_call() 和 check_output() 时,尽量不要将参数stderr和stdout设置为 subprocess.PIPE,这几个函数默认都会等待子进程完成,子进程产生大量的输出数据如果造成管道堵塞,父进程再等待子进程完成可能造成死锁。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python字符串替换示例
Apr 24 Python
Python获取服务器信息的最简单实现方法
Mar 05 Python
在Python中处理时间之clock()方法的使用
May 22 Python
python保存文件方法小结
Jul 27 Python
对sklearn的使用之数据集的拆分与训练详解(python3.6)
Dec 14 Python
python flask框架实现重定向功能示例
Jul 02 Python
使用 Django Highcharts 实现数据可视化过程解析
Jul 31 Python
详解centos7+django+python3+mysql+阿里云部署项目全流程
Nov 15 Python
pytorch 归一化与反归一化实例
Dec 31 Python
Python有参函数使用代码实例
Jan 06 Python
Pandas加速代码之避免使用for循环
May 30 Python
linux中nohup和后台运行进程查看及终止
Jun 24 Python
Python Pandas数据分析工具用法实例
Nov 05 #Python
Python jieba结巴分词原理及用法解析
Nov 05 #Python
Python根据字符串调用函数过程解析
Nov 05 #Python
python报错TypeError: ‘NoneType‘ object is not subscriptable的解决方法
Nov 05 #Python
Python利用matplotlib绘制折线图的新手教程
Nov 05 #Python
详解Django中异步任务之django-celery
Nov 05 #Python
Python Django路径配置实现过程解析
Nov 05 #Python
You might like
PHP5中使用DOM控制XML实现代码
2010/05/07 PHP
PHP session_start()问题解疑(详细介绍)
2013/07/05 PHP
php绘图中显示不出图片的原因及解决
2014/03/05 PHP
CodeIgniter整合Smarty的方法详解
2017/08/25 PHP
thinkPHP5项目中实现QQ第三方登录功能
2017/10/20 PHP
防止页面被iframe(兼容IE,Firefox火狐)
2010/07/04 Javascript
Javascript的各种节点操作实例演示代码
2012/06/27 Javascript
JavaScript中的私有/静态属性介绍
2012/07/26 Javascript
JqueryMobile动态生成listView并实现刷新的两种方法
2014/03/05 Javascript
jQuery满意度星级评价插件特效代码分享
2015/08/19 Javascript
javascript HTML5 canvas实现打砖块游戏
2020/06/18 Javascript
详解Angular开发中的登陆与身份验证
2016/07/27 Javascript
js清除浏览器缓存的几种方法
2017/03/15 Javascript
微信小程序canvas写字板效果及实例
2017/06/15 Javascript
深入理解vue.js中$watch的oldvalue与newValue
2017/08/07 Javascript
angular第三方包开发整理(小结)
2018/04/19 Javascript
Vue 3.0 前瞻Vue Function API新特性体验
2019/08/12 Javascript
帮你彻底搞懂JS中的prototype、__proto__与constructor(图解)
2019/08/23 Javascript
React 父子组件通信的实现方法
2019/12/05 Javascript
JavaScript函数重载操作实例浅析
2020/05/02 Javascript
[00:15]天涯墨客终极技能展示
2018/08/25 DOTA
python标准算法实现数组全排列的方法
2015/03/17 Python
关于Python的一些学习总结
2018/05/25 Python
Python面向对象进阶学习
2019/05/21 Python
python清空命令行方式
2020/01/13 Python
HTML5+CSS3实现机器猫
2016/10/17 HTML / CSS
Sisley法国希思黎中国官网:享誉全球的奢华植物美容品牌
2019/06/30 全球购物
自动化专业个人求职信范文
2013/12/30 职场文书
小学音乐教学反思
2014/02/05 职场文书
简历里的自我评价范文
2014/02/24 职场文书
2014新生大学四年计划书
2014/09/21 职场文书
党员教师学习党的群众路线教育实践活动心得体会
2014/10/31 职场文书
典型事迹材料范文
2014/12/29 职场文书
2015年世界艾滋病日活动总结
2015/03/24 职场文书
蜗居观后感
2015/06/11 职场文书
2016小学优秀教师先进事迹材料
2016/02/26 职场文书