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学习小技巧之利用字典的默认行为
May 20 Python
Python 加密的实例详解
Oct 09 Python
python 实现判断ip连通性的方法总结
Apr 22 Python
Python----数据预处理代码实例
Mar 20 Python
pandas通过字典生成dataframe的方法步骤
Jul 23 Python
详解Django将秒转换为xx天xx时xx分
Sep 27 Python
关于numpy.where()函数 返回值的解释
Dec 06 Python
Python使用enumerate获取迭代元素下标
Feb 03 Python
Python使用ElementTree美化XML格式的操作
Mar 06 Python
Python实现自动打开电脑应用的示例代码
Apr 17 Python
python selenium 获取接口数据的实现
Dec 07 Python
opencv python 对指针仪表读数识别的两种方式
Jan 14 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
消息持续发送的完整例子
2006/10/09 PHP
基于PHP静态类的原罪详解
2013/05/06 PHP
解密ThinkPHP3.1.2版本之模块和操作映射
2014/06/19 PHP
PHP读取XML格式文件的方法总结
2017/02/27 PHP
JavaScript的类型简单说明
2010/09/03 Javascript
超越Jquery_01_isPlainObject分析与重构
2010/10/20 Javascript
基于JavaScript 类的使用详解
2013/05/07 Javascript
jquery 设置style:display的方法
2015/01/29 Javascript
解析Javascript单例模式概念与实例
2016/12/05 Javascript
Vue+element 解决浏览器自动填充记住的账号密码问题
2019/06/11 Javascript
js中apply和call的理解与使用方法
2019/11/27 Javascript
微信小程序停止其他视频播放当前视频的实例代码
2019/12/25 Javascript
基于JavaScript实现贪吃蛇游戏
2020/03/16 Javascript
用vue 实现手机触屏滑动功能
2020/05/28 Javascript
npm全局环境变量配置详解
2020/12/15 Javascript
微信小程序自定义modal弹窗组件的方法详解
2020/12/20 Javascript
[36:43]NB vs Optic 2018国际邀请赛小组赛BO1 B组加赛 8.19
2018/08/21 DOTA
[03:41]2018完美盛典-《Fight With Us》
2018/12/16 DOTA
python中requests爬去网页内容出现乱码问题解决方法介绍
2017/10/25 Python
详解supervisor使用教程
2017/11/21 Python
Python3.4 tkinter,PIL图片转换
2018/06/21 Python
使用Python paramiko模块利用多线程实现ssh并发执行操作
2019/12/05 Python
手把手教你实现一个canvas智绘画板的方法
2019/03/04 HTML / CSS
Skip Hop官网:好莱坞宝宝挚爱品牌
2018/06/17 全球购物
为什么使用接口?
2014/08/13 面试题
公司庆典邀请函范文
2014/01/13 职场文书
合伙经营协议书
2014/04/18 职场文书
设计师求职信模板
2014/05/06 职场文书
优秀的应届生自荐信
2014/05/23 职场文书
关于运动会广播稿300字
2014/10/05 职场文书
高三教师工作总结2015
2015/07/21 职场文书
新教师教学工作总结
2015/08/14 职场文书
酒店工程部的岗位职责汇总大全
2019/10/23 职场文书
python制作图形界面的2048游戏, 基于tkinter
2021/04/06 Python
Python虚拟环境virtualenv是如何使用的
2021/06/20 Python
MySQL配置主从服务器(一主多从)
2021/08/07 MySQL