调用系统命令之subprocess模块
除了常见的os.system和os.popen方法,官方强烈推荐使用subprocess来调用系统命令。
这个库用起来其实很简单,按照惯例先贴一下官文关键点:
The subprocess module allows you to spawn new processes, connect to their input/output/error pipes, and obtain their return codes.
The recommended approach to invoking subprocesses is to use the run() function for all use cases it can handle.
For more advanced use cases, the underlying Popen interface can be used directly.
推荐的使用方式是:任何场景下,只要调用run()方法即可,已经封装好了一切。
底层接口Popen也可以直接使用,不过要注意管道堵塞问题。
API说明如下:
subprocess.run(args, *, stdin=None, input=None, stdout=None, stderr=None, ...)
Run the command described by args. Wait for command to complete, then return a CompletedProcess instance. 执行命令,等待执行完成,返回CompletedProcess实例
args is required for all calls and should be a string, or a sequence of program arguments.
If passing a single string, shell must be True.
If shell is True, the specified command will be executed through the shell.
On POSIX with shell=True, the shell defaults to /bin/sh. 默认shell是/bin/sh
subprocess.PIPE
Special value that can be used as the stdin, stdout or stderr argument to Popen and indicates that a pipe to the standard stream should be opened.
subprocess.STDOUT
Special value that can be used as the stderr argument to Popen and indicates that standard error should go into the same handle as standard output.
合并错误输出到标准输出
class subprocess.CompletedProcess
The return value from run(), representing a process that has finished.
args
The arguments used to launch the process. This may be a list or a string.
returncode
Exit status of the child process. Typically, an exit status of 0 indicates that it ran successfully.
A negative value -N indicates that the child was terminated by signal N (POSIX only).
stdout
Captured stdout from the child process. A bytes sequence, or a string if run() was called with an encoding, errors, or text=True.
看不懂英文的同学可以略过API说明,下面来说使用姿势。
这里提供两种传参方式,一种是将要执行的命令以一整个字符串传入,一种是以序列方式传入,具体来说是这样:
subprocess.run(["ls", "-l"])
subprocess.run('ls -l', shell=True)
r = subprocess.run('ls -l', shell=True, stdout=PIPE, stderr=subprocess.STDOUT)
print(r)
print(type(r))
print(r.stdout.decode()) # 获取结果
print(r.returncode)
仅此而已,就这么简单。
关于Popen,简单说几句。
This will deadlock when using stdout=PIPE or stderr=PIPE and the child process generates enough output to a pipe,
such that it blocks waiting for the OS pipe buffer to accept more data. Use Popen.communicate() when using pipes to avoid that.
官文说Popen中使用PIPE可能会造成堵塞,建议使用Popen.communicate()来避免这个问题。
这一点,run()方法已经封装解决了,直接使用run()方法可以不理会这个问题。
解决这个问题还有一个思路,就是不用PIPE。使用临时文件保存输出。
from subprocess import Popen
from tempfile import TemporaryFile
with TemporaryFile(mode='w+b') as f: # 使用临时文件保存输出结果,避免死锁
with Popen('ifconfig', shell=True, stdout=f, stderr=subprocess.STDOUT) as proc:
status = proc.wait()
f.seek(0) # 写文件时指针在文末所以读取文件需要移动指针
print(f.read().decode())
print(status)
另外,这个模块里面还有一个老方法可以用来执行命令。
implicitly invoke the system shell.
subprocess.getoutput(cmd)
Return output (stdout and stderr) of executing cmd in a shell.
r = subprocess.getoutput('ls -l')
print(r)
print(type(r))
# <class 'str'>
一句话,请使用subprocess.run()方法,其它可以忽略。
参考:
https://docs.python.org/3/library/subprocess.html
https://docs.python.org/3/library/tempfile.html
调用系统命令之subprocess模块的更多相关文章
- 23-[模块]-subprocess模块
1.调用系统命令 我们经常需要通过Python去执行一条系统命令或脚本,系统的shell命令是独立于你的python进程之外的,每执行一条命令,就是发起一个新进程,通过python调用系统命令或脚本的 ...
- python常用模块-调用系统命令模块(subprocess)
python常用模块-调用系统命令模块(subprocess) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. subproces基本上就是为了取代os.system和os.spaw ...
- Python 调用系统命令的模块 Subprocess
Python 调用系统命令的模块 Subprocess 有些时候需要调用系统内部的一些命令,或者给某个应用命令传不定参数时可以使用该模块. 初识 Subprocess 模块 Subprocess 模块 ...
- 使用python的subprocess模块调用linux系统命令
subprocess模块主要有call().check_call().check_output().Popen()函数,简要描述如下: Main API ======== call(...): Run ...
- Python用subprocess的Popen来调用系统命令
当我们须要调用系统的命令的时候,最先考虑的os模块.用os.system()和os.popen()来进行操作.可是这两个命令过于简单,不能完毕一些复杂的操作,如给执行的命令提供输入或者读取命令的输出, ...
- Python使用subprocess的Popen要调用系统命令
当我们须要调用系统的命令的时候,最先考虑的os模块.用os.system()和os.popen()来进行操作.可是这两个命令过于简单.不能完毕一些复杂的操作,如给执行的命令提供输入或者读取命令的输出, ...
- s14 第5天 时间模块 随机模块 String模块 shutil模块(文件操作) 文件压缩(zipfile和tarfile)shelve模块 XML模块 ConfigParser配置文件操作模块 hashlib散列模块 Subprocess模块(调用shell) logging模块 正则表达式模块 r字符串和转译
时间模块 time datatime time.clock(2.7) time.process_time(3.3) 测量处理器运算时间,不包括sleep时间 time.altzone 返回与UTC时间 ...
- Python模块之subprocess--使用Popen来调用系统命令
当我们需要调用系统的命令的时候,最先考虑的os 模块.用os.system()和os.popen()来进行操作.但是这两个命令过于简单,不能完成一些复杂的操作,如给运行的命令提供输入或者读取命 令的输 ...
- Python学习笔记——基础篇【第六周】——Subprocess模块
执行系统命令 可以执行shell命令的相关模块和函数有: os.system os.spawn* os.popen* --废弃 popen2.* --废弃 com ...
随机推荐
- 爬虫学习--http请求详解
上篇博客里面写了,爬虫就是发http请求(浏览器里面打开发送的都是http请求),然后获取到response,咱们再从response里面找到想要的数据,存储到本地. 咱们本章就来说一下什么是http ...
- 【转载】固态硬盘的S.M.A.R.T详解
文章来源于: 瑞耐斯存储技术 兵哥写这篇文章,是因为在测试的过程中看到了 SSD存在偶尔有性能下降的情况,经分析为S.M.A.R.T命令所导致,虽然这种情况看似不严重,但如果应用在诸如数据采集等关键性 ...
- 【下一代核心技术DevOps】:(六)Rancher集中存储及相关应用
1. 前言 为什么要使用集中存储? 使用集中存储有个很大的优势是数据安全和统一管理,和集群完美配合. 产品集成存储经历过几个阶段: 1.单机本机存储. 系统使用本地硬盘存储 2.单网络集中存储. 局域 ...
- C#抽象类跟接口
抽象类描述的是一个什么东西,属性. 抽象类是对类的抽象,描述是什么 抽象类,继承后重写接口描述的是他做什么,行为.接口是对行为的抽象,描述做什么 ,进行继承后实行接口
- springcloud 笔记
官方教程 http://projects.spring.io/spring-cloud/ guide https://github.com/spring-guides 伪官方教程 https://sp ...
- 定时备份windows机器上的文件到linux服务器上的操作梳理(rsync)
由于需要对网络设备做备份,备份文件是放到windows机器上的.现在需要将备份数据同步到linux备份机器上,想到的方案有三种: 1)将windows的备份目录共享出来,然后在linux服务器上进行挂 ...
- linux-shell-命令总结
第一种方法执行: 第二种方法执行: 第三种方法执行: 第四种方法:执行 第三种和第四种方法都是在新的进程里执行程序 函数方法 方法就是一个命令,命令写在字符串的第一个位置 type:可以接外部命令 ...
- Visual Studio的安装与单元测试
一.Visual Studio的安装 由于上学期重装了win10系统,以前使用的vc++6.0不能够正常使用,所以直接就安装了Visual Studio 2015,安装的时候就直接按照提示的步骤进行安 ...
- 《Linux内核设计与实现》第四章读书笔记
4.1 多任务 多任务操作系统就是能同时并发地交互执行多个进程的操作系统. 多任务系统可以划分为两类: 非抢占式多任务进程会一直执行直到自己主动停止运行 抢占式多任务Linux/Unix使用的是抢占式 ...
- Liinux 学习心得
Linux 内核学习心得 姬梦馨 原创作品 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 反汇编一个简 ...