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 相关文章推荐
python2.7删除文件夹和删除文件代码实例
Dec 18 Python
python3使用tkinter实现ui界面简单实例
Jan 10 Python
python 类对象和实例对象动态添加方法(分享)
Dec 31 Python
pandas.loc 选取指定列进行操作的实例
May 18 Python
Python对excel文档的操作方法详解
Dec 10 Python
常用python爬虫库介绍与简要说明
Jan 25 Python
Django CSRF认证的几种解决方案
Mar 03 Python
python使用pymongo与MongoDB基本交互操作示例
Apr 09 Python
基于Keras中Conv1D和Conv2D的区别说明
Jun 19 Python
Python 爬虫性能相关总结
Aug 03 Python
OpenCV读取与写入图片的实现
Oct 13 Python
Python中Schedule模块使用详解 周期任务神器
Apr 19 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连接MySQL代码的参数说明
2008/06/07 PHP
抓取YAHOO股票报价的类
2009/05/15 PHP
PHP的文件操作与算法实现的面试题示例
2015/08/10 PHP
php函数mkdir实现递归创建层级目录
2016/10/27 PHP
php mysql操作mysql_connect连接数据库实例详解
2016/12/26 PHP
javascript的事件描述
2006/09/08 Javascript
基于Jquery+Ajax+Json的高效分页实现代码
2011/10/29 Javascript
Egret引擎开发指南之发布项目
2014/09/03 Javascript
jquery和js实现对div的隐藏和显示方法
2014/09/26 Javascript
JavaScript中exec函数用法实例分析
2015/06/08 Javascript
JavaScript定时器和优化的取消定时器方法
2015/07/03 Javascript
js+css简单实现网页换肤效果
2015/12/29 Javascript
vue实现动态数据绑定
2017/04/28 Javascript
详解JavaScript中return的用法
2017/05/08 Javascript
浅谈Node Inspector 代理实现
2017/10/19 Javascript
Bootstrap-table自定义可编辑每页显示记录数
2018/09/07 Javascript
详解@angular/cli 改变默认启动端口两种方式
2018/11/29 Javascript
Javascript三种字符串连接方式及性能比较
2019/05/28 Javascript
解决antd日期选择组件,添加value就无法点击下一年和下一月问题
2020/10/29 Javascript
vue下拉刷新组件的开发及slot的使用详解
2020/12/23 Vue.js
python中实现定制类的特殊方法总结
2014/09/28 Python
简单介绍Python中的readline()方法的使用
2015/05/24 Python
Django发送html邮件的方法
2015/05/26 Python
python获取当前用户的主目录路径方法(推荐)
2017/01/12 Python
Python判断变量是否为Json格式的字符串示例
2017/05/03 Python
Python实现判断并移除列表指定位置元素的方法
2018/04/13 Python
wxPython实现绘图小例子
2019/11/19 Python
python梯度下降算法的实现
2020/02/24 Python
判断Threading.start新线程是否执行完毕的实例
2020/05/02 Python
如何在Cookie里面保存Unicode和国际化字符
2013/05/25 面试题
师范大学毕业自我鉴定
2013/11/21 职场文书
消防安全宣传口号
2014/06/10 职场文书
团日活动总结报告
2014/06/25 职场文书
校园安全教育心得体会
2016/01/15 职场文书
PyQt5实现多张图片显示并滚动
2021/06/11 Python
Win11怎么添加用户?Win11添加用户账户的方法
2022/07/15 数码科技