Python中 os.popen、os.system和subprocess.popen方法介绍

2023-05-16

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 os

command = "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 os

command = "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 subprocess

command = "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 subprocess

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).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 subprocess

commands = ['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--
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python中 os.popen、os.system和subprocess.popen方法介绍 的相关文章

随机推荐

  • 【Flutter入门到进阶】Dart进阶篇---进阶用法

    1 Dart对象扩展 1 1 extension 1 1 1 介绍 可以在不更改类或创建子类的情况下 xff0c 向类添加扩展功能的一种方式 灵活使用 extension 对基础类进行扩展 xff0c 对开发效率有显著提升 1 1 2 需求
  • 中国天气网API(最新接口)

    一 产品概述 SmartWeatherAPI 接口 简称 SWA 接口 是中国气象局面向 网络媒体 手机厂商 第三方气象服务机构等用户 xff0c 通过 web 方 式提供数据气象服务的官方载体 二 使用说明 该数据主要包括预警 实况 指数
  • MySQL事务:事务隔离

    对数据进行并发操作时 xff0c 事务可以确保数据的完整性 xff0c 在银行 证券交易等业务场景需要用到它 xff0c 本文将介绍MySQL事务是如何保证数据的一致性的 目录 事务特性事务启动与提交事务回滚 什么是事务隔离事务隔离级别 事
  • MySQL锁:全局锁、表级锁和行锁

    事务的实现离不开MySQL数据库的锁机制 xff0c 设计锁的目的也是为了处理并发访问问题 xff0c 本文简单介绍MySQL 里面的全局锁 表级锁和行锁三类锁 目录 全局锁表级锁表锁1 读锁实例2 写锁实例 元数据锁 行锁行锁简介行锁实例
  • Java环境安装配置步骤介绍

    本文记录Windows环境和Linux环境 centos7 安装Java以及Linux环境升级Java JDK版本的步骤 目录 Windows环境安装Java JDK1 下载安装2 配置环境变量 Linux环境安装Java JDK1 下载安
  • Maven 安装和配置方法详解

    通常一个Java项目会引用大量的 jar 包 xff0c 而jar 包之间可能存在各种依赖关系 xff0c 如果运行Java项目时仅使用classpath 参数来管理jar包会非常不方便 xff0c 此外 xff0c 在项目编译 打包 升级
  • MySQL索引介绍

    索引主要是用来提高数据库的查询效率的 xff0c 它对指定的列或列的集合生成索引 xff0c 然后可以通过索引来检索目标数据 xff0c 就像目录一样 xff0c 缩小了扫描范围 xff0c 大大提高了查询效率 如果不使用索引 xff0c
  • 第二、UIScrollView的使用大全

    UIScrollView 原理详解 ScrollView UIScrollView UIScrollView 为了显示多于一个屏幕的内容或者超过你能放在内存中的内容 Scroll View 为你处理缩小放大手势 xff0c UIScroll
  • 持续集成平台Jenkins:docker镜像升级

    Jenkins 2 357 及 LTS 2 361 1之后的版本要求Java 11 或者 17 xff0c 如果使用的是Java 8 xff0c 要升级最新版本的Jenkins xff0c 就需要升级Java JDK版本 xff0c 本文记
  • 持续集成:通过Jenkins API创建项目和节点

    我在持续集成 xff1a Jenkins API使用方法详细介绍中介绍了jenkins API的使用方法 xff0c 比如使用API读取jenkins项目相关信息 触发构建等操作 xff0c 除此之外 xff0c 还可以直接使用API来创建
  • Android APP稳定性测试工具Fastbot

    我在 自动遍历测试之Monkey工具 和 AppCrawler自动遍历测试 分别介绍了APP稳定性测试工具monkey和AppCrawler xff0c 它们各有优缺点 xff0c 本文介绍另一款也比较好用的稳定性测试工具Fastbot 目
  • 持续集成:使用Jenkins API创建视图

    持续集成 xff1a 通过Jenkins API创建项目和节点介绍了使用jenkins API来创建项目和新建节点 xff0c jenkins API也可以创建视图 xff08 view xff09 目录 1 获取视图配置文件2 创建视图3
  • Fiddler抓取手机APP报文

    Http协议代理工具有很多 xff0c 比如Burp Suite Charles Jmeter Fiddler等 xff0c 它们都可以用来抓取APP报文 xff0c 其中charles和Burp Suite是收费的 xff0c Jmete
  • 使用Jmeter抓取手机APP报文并进行APP接口测试

    Jmeter是一个比较常用的接口测试工具 xff0c 尤其是接口性能测试 当然它也可以用来测试手机APP的HTTP接口 xff0c 我在Fiddler抓取手机APP报文 和 接口测试代理工具charles mock测试 分别介绍了Fiddl
  • 禅道二次开发技巧

    本文记录一些进行禅道二次开发的技巧 目录 代码调试方法1 xff1a error log方法方法2 xff1a file put contents方法方法3 xff1a a var 方法 禅道扩展技巧1 读取当前用户2 读取当前模块方法名3
  • git merge 和 git rebase 的区别

    Git版本控制中 xff0c git rebase 和 git merge 这两个命令都可以用来集成从一个分支和另一个分支的更改 它们是两种不同的合并方法 xff0c 本文将介绍它们的差异 git rebase 和 git merge 主要
  • SVN项目迁移到Git方法

    本文记录如何将SVN项目迁移到Git xff0c 并保留提交日志信息 目录 Git和SVN差异环境准备Git安装 配置 项目迁移1 将源SVN库转换到Git本地仓库2 添加Git远程库地址3 推送代码到Git 常见错误参考文档 Git和SV
  • Python日志系统logging使用介绍

    日志记录对于软件开发调试和运行都非常重要 Python标准库提供了一个日志记录系统 xff0c 可以很方便的在python项目中添加日志记录 本文将详细介绍如何使用python的 logging 模块来记录日志 目录 基础使用日志级别基本配
  • xrdp连接太多后,连接不上的解决方法

    因为每次都是新建连接 xff0c 端口不断被占用 默认session个数10个 有一个最简单的 xff0c 但是不推荐的办法 xff0c 就是把最大连接数改大 xff0c 比如原来是10 xff0c 就改为100 这种方式治标不治本 xff
  • Python中 os.popen、os.system和subprocess.popen方法介绍

    Python 提供了多种与操作系统交互的方法 xff0c 比如os模块中的popen和system方法 xff0c 此外 xff0c Python subprocess模块中的Popen类也提供了与操作系统交互的方法 xff0c 使用起来更