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实现的用于搜索文件并进行内容替换的类实例
Jun 28 Python
python MysqlDb模块安装及其使用详解
Feb 23 Python
利用Python如何批量修改数据库执行Sql文件
Jul 29 Python
Python实现多属性排序的方法
Dec 05 Python
详解Python进阶之切片的误区与高级用法
Dec 24 Python
对python多线程中Lock()与RLock()锁详解
Jan 11 Python
浅谈Python基础—判断和循环
Mar 22 Python
Python使用scipy模块实现一维卷积运算示例
Sep 05 Python
python 如何将数据写入本地txt文本文件的实现方法
Sep 11 Python
jupyter notebook tensorflow打印device信息实例
Apr 20 Python
python 一维二维插值实例
Apr 22 Python
Pytorch 扩展Tensor维度、压缩Tensor维度的方法
Sep 09 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
PHP字符编码问题之GB2312 VS UTF-8解决方法
2011/06/23 PHP
PHP分多步骤填写发布信息的简单方法实例代码
2012/09/23 PHP
支持汉转拼和拼音分词的PHP中文工具类ChineseUtil
2018/02/23 PHP
宝塔面板在NGINX环境中TP5.1如何运行?
2021/03/09 PHP
IE中jscript/javascript的条件编译
2006/09/07 Javascript
JavaScript中也使用$美元符号来代替document.getElementById
2010/06/19 Javascript
IE的fireEvent方法概述及应用
2013/02/22 Javascript
jQuery设置div一直在页面顶部显示的方法
2013/10/24 Javascript
JS+CSS实现简易实用的滑动门菜单效果
2015/09/18 Javascript
简单谈谈JS数组中的indexOf方法
2016/10/13 Javascript
利用Angularjs中模块ui-route管理状态的方法
2016/12/27 Javascript
jQuery中的siblings()是什么意思(推荐)
2016/12/29 Javascript
原生js实现秒表计时器功能
2017/02/16 Javascript
nodejs搭建本地http服务器教程
2017/03/13 NodeJs
简单谈谈关于Angular Cli打包的事
2017/09/05 Javascript
微信小程序实现聊天对话(文本、图片)功能
2018/07/06 Javascript
layer弹出层 iframe层去掉滚动条的实例代码
2018/08/17 Javascript
解决layer弹出层自适应页面大小的问题
2019/09/16 Javascript
Vue.js下拉菜单组件使用方法详解
2019/10/19 Javascript
Vue使用vue-recoure + http-proxy-middleware + vuex配合promise实现基本的跨域请求封装
2019/10/21 Javascript
node.js开发辅助工具nodemon安装与配置详解
2020/02/06 Javascript
原生javascript中this几种常见用法总结
2020/02/24 Javascript
[51:34]Ti4主赛事胜者组 DK vs EG 2
2014/07/19 DOTA
Python数据分析matplotlib设置多个子图的间距方法
2018/08/03 Python
Python中几种属性访问的区别与用法详解
2018/10/10 Python
使用selenium模拟登录解决滑块验证问题的实现
2019/05/10 Python
移动端Html5页面生成图片解决方案
2018/08/07 HTML / CSS
学前教育毕业生自荐信
2013/10/29 职场文书
教师的实习自我鉴定
2013/12/17 职场文书
生物学学生自我评价
2014/01/17 职场文书
英语专业求职信
2014/07/08 职场文书
小学校园广播稿(3篇)
2014/09/19 职场文书
百家讲坛观后感
2015/06/12 职场文书
实习报告范文
2019/07/30 职场文书
详解解Django 多对多表关系的三种创建方式
2021/08/23 Python
React Fragment介绍与使用详解
2021/11/11 Javascript