首页 > 编程语言 >Python中 os.popen、os.system和subprocess.popen方法介绍

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

时间:2023-04-25 20:33:26浏览次数:54  
标签:system stdout stdin Popen subprocess popen os

Python 提供了多种与操作系统交互的方法,比如os模块中的popen和system方法,此外,Python subprocess模块中的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--

标签:system,stdout,stdin,Popen,subprocess,popen,os
From: https://www.cnblogs.com/hiyong/p/17237891.html

相关文章

  • BAT dos界面颜色
    salute: >>>>>>设置BAT批处理窗口显示颜色_batcolor_亦游的博客-CSDN博客 测试代码如下:chcp65001@echooffcolor0Apause......
  • okhttp3的基本使用(post发送json示例)
    依赖<!--https://mvnrepository.com/artifact/com.squareup.okhttp3/okhttp--><dependency><groupId>com.squareup.okhttp3</groupId><artifactId>okhttp</artifactId><ve......
  • 在程序里面执行system(“cd /某个目录“),为什么路径切换不成功?
    粉丝提问:彭老师,问下,在程序里面执行system("cd/某个目录"),这样会切换不成功,为啥呢实例代码:粉丝的疑惑是明明第10行执行了cd/media操作,为什么12行执行的pwd>test2.txt结果提示的仍然是当前目录?这是一个很不错的问题,要想整明白这个问题,需要知道system的原理。system()函......
  • 多线程-从os层面理解常见概念
    如何创建一个线程在Linux系统中有一个方法,他有四个参数,其中第一个参数是利用指针传入,后期如果被修改也会同步修改,第三个参数和自己定义的run方法有关,后面会详细说。intpthread_create(pthread_t*thread,constpthread_attr_t*attr,void*(*start_routine)(void*),vo......
  • centos7下安装ifconfig 命令
    1,查找安装包 [root@localhostnetwork-scripts]#yumsearchifconfig已加载插件:fastestmirrorLoadingmirrorspeedsfromcachedhostfile*base:centos.ustc.edu.cn*extras:centos.ustc.edu.cn*updates:centos.ustc.edu.cn===================================......
  • iOS MachineLearning 系列(4)—— 静态图像分析之物体识别与分类
    iOSMachineLearning系列(4)——静态图像分析之物体识别与分类本系列的前几篇文件,详细了介绍了Vision框架中关于静态图片区域识别的内容。本篇文章,我们将着重介绍静态图片中物体的识别与分类。物体识别和分类也是MachineLearning领域重要的应用。通过大量的图片数据进行训练后,模......
  • Nginx + Nacos2.x集群配置
    Nginx:#集群配置http{upstreamnacos-cluster{ip_hash;server127.0.0.1:8858;server127.0.0.1:8868;server127.0.0.1:8878;}server{listen8838;server_namelocalhost;}location/nacos{ ......
  • centos linux系统安装详解
    打开vmware,版本差异区别不大选择创建新的虚拟机  选择典型,是默认选项不用改,点击下一步 选择稍后安装操作系统(默认选项不用改),点击下一步 选择linux,并且版本改为centos64位,点击下一步 虚拟机名称随便改,位置是指虚拟机的位置,点击浏览,自己选择位置,点击下一步 最大......
  • 如何建设一个用于编译 iOS App 的 macOS 云服务器集群?
    作者:京东零售叶萌现代软件开发一般会借助CI/CD来提升代码质量、加快发版速度、自动化重复的事情,iOSApp只能在mac机器上编译,CI/CD工具因此需要有一个macOS云服务器集群来执行iOSApp的编译。今天就来谈谈如何建设macOS云服务器集群购买macmini/MacStudio机......
  • golang 通过 os 包进行文件读写
    go中os包主要与操作系统打交道,实际底层还是通过相关的系统调用实现文件的读写操作,今天我们就来聊聊通过os包实现文件的读写操作。我们在使用os包进行相关操作时,主要流程:读操作open->read->close写操作open->read->write->close总体来说,读写操作都......