Python 提供了多种与操作系统交互的方法,比如os模块中的popen和system方法,此外,Python subprocess模块中的Popen类也提供了与操作系统交互的方法,使用起来更加灵活,本文将简单介绍这几种方法。

目录

  • os.popen方法
  • os.system方法
  • susbprocess.Popen方法
    • 替代 `os.popen()` 方法
    • 替代 `os.system()` 方法
    • 管道命令
    • 执行多条命令
    • Popen方法
  • 总结

os.popen方法

os.popen方法语法格式:

os.popen(cmd, mode, buffering)
  • cmd:要执行的命令
  • mode:默认mode="r",表示输出文件可读,w 表示可写
  • buffering:缓存区数据大小

示例:

import oscommand = "netsh interface ip show address WAN | findstr IP"
p = os.popen(command, 'r')
print(p.read())

输出:

    IP 地址:                           192.168.0.104

Python2 os模块另外还提供了popen2、popen3和popen4方法与操作系统交互。

os.popen2os.popen方法的区别是os.popen2返回了一个用于stdin和用于stdout的两个文件对象。os.popen3 多了错误输出stderros.popen4 将标准输出和错误输出合并:

stdout                = os.popen(cmd, mode, bufsize)
stdin, stdout         = os.popen2(cmd, mode, bufsize)
stdin, stdout, stderr = os.popen3(cmd, mode, bufsize)
stdin, stdout_stderr  = os.popen4(cmd, mode, bufsize)

这些方法这里不做更多介绍了,它们都可以使用 subprocess.Popen 来替代:

# os.popen
pipe = subprocess.Popen(cmd, shell=True, bufsize=bufsize, stdout=PIPE).stdout
pipe = subprocess.Popen(cmd, shell=True, bufsize=bufsize, stdin=PIPE).stdin
# os.popen2
p = Popen(cmd, shell=True, bufsize=bufsize, stdin=PIPE, stdout=PIPE, close_fds=True)
stdin  = p.stdin
stdout = p.stdout
# os.popen3
p = Popen(cmd, shell=True, bufsize=bufsize, stdin=PIPE, stdout=PIPE, stderr=PIPE, close_fds=True)
stdin  = p.stdin
stdout = p.stdout
stderr = p.stderr
# os.popen4
p = Popen(cmd, shell=True, bufsize=bufsize,stdin=PIPE, stdout=PIPE, stderr=STDOUT, close_fds=True)
stdin  = p.stdin
stdout_stderr = p.stdout

os.system方法

os.system 方法调用C函数system(),只会返回状态码,命令产生的输出会发送到控制台。

import oscommand = "netsh interface ip show address WAN | findstr IP"
p = os.system(command)
print(p)

输出:

    IP 地址:                           192.168.0.104
0

susbprocess.Popen方法

susbprocess模块提供了Popen类,是os.systemos.popen 方法的超集,可替代os.systemos.popen 方法,语法格式如下:

subprocess.Popen(args, bufsize=-1, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=True, shell=False, cwd=None, env=None, universal_newlines=None, startupinfo=None, creationflags=0, restore_signals=True, start_new_session=False, pass_fds=(), *, encoding=None, errors=None, text=None)

替代 os.popen() 方法

替代 os.popen(command, 'r') 方法

import subprocesscommand = "netsh interface ip show address WAN | findstr IP"
p = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE).stdout
print(p.read().decode('gbk'))

输出:

    IP 地址:                           192.168.0.104

替代 os.system() 方法

替代 os.system(command) 方法:

command = "netsh interface ip show address WAN | findstr IP"
p = subprocess.Popen(command, shell=True).wait()
print(p)

输出:

    IP 地址:                           192.168.0.104
0

susbprocess模块除了可以替代os.systemos.popen 方法以及前面介绍的popen2、popen3和popen4方法外,还可以替代 os.spawn

管道命令

除了将管道符|直接写入命令中以外,也可以使用以下方式实现管道命令:

import subprocessp1 = subprocess.Popen('netsh interface ip show address WAN', shell=True, stdin=None, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
p2 = subprocess.Popen('findstr IP', shell=True, stdin=p1.stdout, stdout=subprocess.PIPE).stdout
print(p2.read().decode('gbk'))# 或者
p1 = subprocess.Popen('netsh interface ip show address WAN', shell=True, stdin=None, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
p2 = subprocess.Popen('findstr IP', shell=True, stdin=p1.stdout, stdout=subprocess.PIPE)
p1.stdout.close()
out, err = p2.communicate()
print(out.decode('gbk'))# 或者使用 subprocess.check_output 方法
output = subprocess.check_output("netsh interface ip show address WAN | findstr IP", shell=True)
print(output.decode('gbk'))

执行多条命令

可使用如下方式连续执行多个命令:

import subprocesscommands = ['mkdir log', 'cd log','echo "test" > test.txt','dir']
p = subprocess.Popen('cmd.exe', stdin=subprocess.PIPE,stdout=subprocess.PIPE, stderr=subprocess.PIPE)
for cmd in commands:p.stdin.write((cmd + "\n").encode('utf-8'))
p.stdin.close()print(p.stdout.read().decode('gbk'))

Popen方法

在前面的例子中使用到了Popen类提供的 communicate()wait()方法,主要有以下方法:

方法 描述
Popen.poll() 检查进程是否终止
Popen.wait(timeout=None) 等待进程终止
Popen.communicate(input=None, timeout=None) 与进程交互:发送数据到stdin。从stdout和stderr读取数据。等待进程终止并设置returncode属性。
Popen.send_signal(signal) 向进程发送signal
Popen.terminate() 终止进程
Popen.kill() 杀死进程

总结

本文只是简单介绍了os.popen、os.system和subprocess.popen这三个方法,subprocess.popen还有更多的用法,它提供了对进程更细粒度的控制。subprocess.popen方法可以替代os.popen、os.system方法,subprocess.popen是他们的超集,如果只是简单的cmd命令调用可以直接使用os.popen和os.system,更复杂的控制可以选用subprocess.popen方法,按照自己实际情况进行选择。

参考文档:

  1. https://docs.python.org/zh-cn/3.7/library/subprocess.html
  2. https://docs.python.org/3/library/subprocess.html#replacing-os-system

--THE END--

Python中 os.popen、os.system和subprocess.popen方法介绍相关推荐

  1. python执行系统命令的方法_python执行系统命令的方法 :os.system(),subprocess.popen(),command...

    最近接触到os.system(),subprocess.popen()和commands来执行系统命令,从网上搜索到许多,现整理如下. 1. 使用os.system("cmd") ...

  2. python文件路径拼接多出斜杠_浅谈python中拼接路径os.path.join斜杠的问题

    浅谈python中拼接路径os.path.join斜杠的问题 调试程序的过程中,发现通过os.path.join拼接的路径出现了反斜杠 directory1='/opt/apps/upgradePac ...

  3. python字符串拼接数字_解决Python中字符串和数字拼接报错的方法

    解决Python中字符串和数字拼接报错的方法 前言 众所周知Python不像JS或者PHP这种弱类型语言里在字符串连接时会自动转换类型,如果直接将字符串和数字拼接会直接报错. 如以下的代码: # co ...

  4. 第7.26节 Python中的@property装饰器定义属性访问方法getter、setter、deleter 详解

    第7.26节 Python中的@property装饰器定义属性访问方法getter.setter.deleter 详解 一.    引言 Python中的装饰器在前面接触过,老猿还没有深入展开介绍装饰 ...

  5. python中常见的三种选择结构_在Python中,实现多分支选择结构的最佳方法是

    在Python中,实现多分支选择结构的最佳方法是 答:if-elif-else 绘制建筑平面图时,被剖切的墙用 线绘制,定位轴线用 线绘制 答:粗实 细点画 智慧职教: 下列关于书写住院病历的叙述不正 ...

  6. 介绍python中几种遍历列表的for循环方法

    我们在使用列表的过程中,经常需要遍历列表的所有元素,对每个元素执行相同的操作.今天就给大家介绍python中几种遍历列表的for循环方法. 首先我们先构造一个numbers列表,如下: numbers ...

  7. python中用于释放类占用的资源的方法是()_mooc大学英语词汇期末答案

    把两个已有项目放到一起,就是一个新项目,这种项目来源属于(?? ) 答:整合 辩证法同形而上学的斗争 答:是从属于唯物主义同唯心主义的斗争,并同这种斗争交织在一起的 中国大学MOOC: 广义的计划是对 ...

  8. python 读取图片转换为一维向量_对Python中一维向量和一维向量转置相乘的方法详解...

    对Python中一维向量和一维向量转置相乘的方法详解 在Python中有时会碰到需要一个一维列向量(n*1)与另一个一维列向量(n*1)的转置(1*n)相乘,得到一个n*n的矩阵的情况.但是在pyth ...

  9. python同时打开两个文件_在python中使用with打开多个文件的方法

    虽然初恋是java, 可是最近是越来越喜欢python, 所以决定追根溯源好好了解下python的原理,架构等等.小脑袋瓜不太好使,只能记录下慢慢进步吧 使用with打开文件的好处不多说,这里记录一下 ...

最新文章

  1. try-catch-finally对返回值的影响
  2. 使用CXF开发WebService程序的总结(一):什么是webservice
  3. GridView的多主键(Key)取值问题
  4. web开发课程,HTML常用的五种标签,附赠课程+题库
  5. 浏览器兼容性小记-DOM篇(二)
  6. LayUI清空下拉框的值
  7. 表白公式计算机,理科生公式表白大全
  8. 如何自动加载scratch3.0的页面上实现自动加载原有的作品
  9. iconfont图标引入方式
  10. php screw.so,php_screw
  11. SAR成像处理算法_CS算法_原理
  12. 安装部署ELK系统监控Azure China的NSG和WAF Log
  13. js语法+dom+js图片库+最佳实践+图片库改进版
  14. 8.4.1 搭建自己的SSR
  15. 服务端基础设施开发----整合thumbnailator编写图片插件
  16. Flask项目之个性化微电影网站的实战开发(一)
  17. 艾伟_转载:我对NHibernate的感受(1):对延迟加载方式的误解
  18. Android双卡设备 如何正确获取上网卡运营商类型
  19. 论文笔记:Geo-Neus: Geometry-Consistent Neural Implicit Surfaces Learning for Multi-view Reconstruction
  20. WAS+IHS基础概念整理01

热门文章

  1. framework是什么
  2. 保密管理专业与计算机专业有关吗,保密管理本科专业介绍
  3. 繁体简体QQ字体中文转换工具
  4. LGP (Local Gradient Patterns)特征匹配算法
  5. 为什么按照“阿法狗”的思路去实现人工智能是歧路
  6. js计时器+打字机效果demo
  7. 冰河实验室受邀作为戴尔“人工智能实践课程赋能班”导师,分享《加密网络及其重要性》主题
  8. 56、数据库设计(铁路购票系统)
  9. Angular实现日期,数据和更新
  10. Java——等差数列求和