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编程中包的概念与管理
Oct 16 Python
python利用rsa库做公钥解密的方法教程
Dec 10 Python
Python操作MySQL模拟银行转账
Mar 12 Python
Python爬虫小技巧之伪造随机的User-Agent
Sep 13 Python
用Django写天气预报查询网站
Oct 21 Python
python使用openCV遍历文件夹里所有视频文件并保存成图片
Jan 14 Python
python模块如何查看
Jun 16 Python
Django DRF APIView源码运行流程详解
Aug 17 Python
Python绘制词云图之可视化神器pyecharts的方法
Feb 23 Python
Python基于Opencv识别两张相似图片
Apr 25 Python
Python合并pdf文件的工具
Jul 01 Python
python三子棋游戏
May 04 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
MySQL的FIND_IN_SET函数使用方法分享
2012/03/27 PHP
php连接mssql的一些相关经验及注意事项
2013/02/05 PHP
Php中使用Select 查询语句的实例
2014/02/19 PHP
php文件缓存类汇总
2014/11/21 PHP
提高php编程效率技巧
2015/08/13 PHP
从性能方面考虑PHP下载远程文件的3种方法
2015/12/29 PHP
php实现图片按比例截取的方法
2017/02/06 PHP
php微信公众号开发之微信企业付款给个人
2018/10/04 PHP
PHP date()格式MySQL中插入datetime方法
2019/01/29 PHP
两个DIV等高的JS的实现代码
2007/12/23 Javascript
基于jQuery的投票系统显示结果插件
2011/08/12 Javascript
优化innerHTML操作(提高代码执行效率)
2011/08/20 Javascript
Extjs中ComboBox加载并赋初值的实现方法
2012/03/22 Javascript
javascript中的=等号个数问题两个跟三个有什么区别
2013/10/23 Javascript
遍历DOM对象内的元素属性示例代码
2014/02/08 Javascript
JS点击某个图标或按钮弹出文件选择框的实现代码
2016/09/27 Javascript
jquery封装插件时匿名函数形参和实参的写法解释
2017/02/14 Javascript
基于Angular.js实现的触摸滑动动画实例代码
2017/02/19 Javascript
Java与JavaScript中判断两字符串是否相等的区别
2017/03/13 Javascript
jQuery实现的页面遮罩层功能示例【测试可用】
2017/10/14 jQuery
用POSTMAN发送JSON格式的POST请求示例
2018/09/04 Javascript
node实现socket链接与GPRS进行通信的方法
2019/05/20 Javascript
[40:55]Liquid vs LGD 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
15行Python代码带你轻松理解令牌桶算法
2018/03/21 Python
python二维码操作:对QRCode和MyQR入门详解
2019/06/24 Python
python构建指数平滑预测模型示例
2019/11/21 Python
python ubplot使用方法解析
2020/01/10 Python
Python使用requests模块爬取百度翻译
2020/08/25 Python
使用CSS3的rem属性制作响应式页面布局的要点解析
2016/05/24 HTML / CSS
全球最大的在线橄榄球商店:Lovell Rugby
2018/05/20 全球购物
params有什么用
2016/03/01 面试题
在校大学生个人的自我评价
2014/02/13 职场文书
道德模范先进事迹
2014/02/14 职场文书
工人先锋号事迹材料
2014/12/24 职场文书
2015年社区中秋节活动总结
2015/03/23 职场文书
关于开学的感想
2015/08/10 职场文书