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读取Android permission文件
Nov 01 Python
Python实现的几个常用排序算法实例
Jun 16 Python
Python正则表达式使用经典实例
Jun 21 Python
Python实现base64编码的图片保存到本地功能示例
Jun 22 Python
Python实现查找最小的k个数示例【两种解法】
Jan 08 Python
Python中按键来获取指定的值
Mar 02 Python
django重新生成数据库中的某张表方法
Aug 28 Python
Pytorch DataLoader 变长数据处理方式
Jan 08 Python
Python模块相关知识点小结
Mar 09 Python
Python爬虫Scrapy框架CrawlSpider原理及使用案例
Nov 20 Python
详解如何修改jupyter notebook的默认目录和默认浏览器
Jan 24 Python
python爬虫scrapy框架之增量式爬虫的示例代码
Feb 26 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 命名空间(namespace)
2020/06/30 PHP
给网站上的广告“加速”显示的方法
2007/04/08 Javascript
简单几行JS Code实现IE邮件转发新浪微博
2013/07/03 Javascript
javascript代码运行不出来执行错误的可能情况整理
2013/10/18 Javascript
教你使用javascript简单写一个页面模板引擎
2015/05/05 Javascript
JavaScript实现选择框按比例拖拉缩放的方法
2015/08/04 Javascript
js实现(全选)多选按钮的方法【附实例】
2016/03/30 Javascript
jQuery实现判断控件是否显示的方法
2017/01/11 Javascript
javaScript封装的各种写法
2017/08/14 Javascript
图片加载完成再执行事件的实例
2017/11/16 Javascript
Vue瀑布流插件的使用示例
2018/09/19 Javascript
GOJS+VUE实现流程图效果
2018/12/01 Javascript
vue使用swiper实现中间大两边小的轮播图效果
2019/11/24 Javascript
解决微信授权成功后点击按返回键出现空白页和报错的问题
2020/06/08 Javascript
解决vue项目中出现Invalid Host header的问题
2020/11/17 Javascript
小议Python中自定义函数的可变参数的使用及注意点
2016/06/21 Python
解决Python 遍历字典时删除元素报异常的问题
2016/09/11 Python
Pycharm技巧之代码跳转该如何回退
2017/07/16 Python
Python排序搜索基本算法之插入排序实例分析
2017/12/11 Python
python tensorflow学习之识别单张图片的实现的示例
2018/02/09 Python
Python实现基于POS算法的区块链
2018/08/07 Python
对pandas将dataframe中某列按照条件赋值的实例讲解
2018/11/29 Python
解决Python 使用h5py加载文件,看不到keys()的问题
2019/02/08 Python
浅谈tensorflow中dataset.shuffle和dataset.batch dataset.repeat注意点
2020/06/08 Python
python线程优先级队列知识点总结
2021/02/28 Python
安全检查管理制度
2014/02/02 职场文书
教师师德反思材料
2014/02/15 职场文书
村长贪污检举信
2014/04/04 职场文书
优秀电子工程系毕业生求职信
2014/05/24 职场文书
国家税务局干部作风整顿整改措施
2014/09/18 职场文书
个人债务授权委托书
2014/10/17 职场文书
违章停车检讨书
2014/10/21 职场文书
2015年后备干部工作总结
2015/05/15 职场文书
幼儿园园务工作总结2015
2015/05/18 职场文书
黑白记忆观后感
2015/06/18 职场文书
java中为什么说子类的构造方法默认访问的是父类的无参构造方法
2022/04/13 Java/Android