python自动化开发例子_Python自动化开发从浅入深-语言基础(常用模块)
当我们运行python的时候,我们都是在创建并运行一个进程。正如我们在Linux进程基础中介绍的那样,一个进程可以fork一个子进程,并让这个子进程exec另外一个程序。在Python中,我们通过标准库中的subprocess包来fork一个子进程,并运行一个外部的程序(fork,exec见Linux进程基础)。
subprocess包中定义有数个创建子进程的函数,这些函数分别以不同的方式创建子进程,所以我们可以根据需要来从中选取一个使用。另外subprocess还提供了一些管理标准流(standard stream)和管道(pipe)的工具,从而在进程间使用文本通信。
使用subprocess包中的函数创建子进程的时候,要注意:
1) 在创建子进程之后,父进程是否暂停,并等待子进程运行。
2) 函数返回什么
3) 当returncode不为0时,父进程如何处理。
subprocess.call()
父进程等待子进程完成
返回退出信息(returncode,相当于exit code,见Linux进程基础)
subprocess.check_call()
父进程等待子进程完成
返回0
检查退出信息,如果returncode不为0,则举出错误subprocess.CalledProcessError,该对象包含有returncode属性,可用try...except...来检查(见Python错误处理)。
subprocess.check_output()
父进程等待子进程完成
返回子进程向标准输出的输出结果
检查退出信息,如果returncode不为0,则举出错误subprocess.CalledProcessError,该对象包含有returncode属性和output属性,output属性为标准输出的输出结果,可用try...except...来检查。
这三个函数的使用方法相类似,我们以subprocess.call()来说明:
import subprocess
rc = subprocess.call(["ls","-l"])
我们将程序名(ls)和所带的参数(-l)一起放在一个表中传递给subprocess.call()
可以通过一个shell来解释一整个字符串:
import subprocess
out = subprocess.call("ls -l", shell=True)
out = subprocess.call("cd ..", shell=True)
我们使用了shell=True这个参数。这个时候,我们使用一整个字符串,而不是一个表来运行子进程。Python将先运行一个shell,再用这个shell来解释这整个字符串。
shell命令中有一些是shell的内建命令,这些命令必须通过shell运行,$cd。shell=True允许我们运行这样一些命令。
Popen()
实际上,我们上面的三个函数都是基于Popen()的封装(wrapper)。这些封装的目的在于让我们容易使用子进程。当我们想要更个性化我们的需求的时候,就要转向Popen类,该类生成的对象用来代表子进程。
与上面的封装不同,Popen对象创建后,主程序不会自动等待子进程完成。我们必须调用对象的wait()方法,父进程才会等待 (也就是阻塞block):
import subprocess
child = subprocess.Popen(["ping","-c","5","www.google.com"])
print("parent process")
从运行结果中看到,父进程在开启子进程之后并没有等待child的完成,而是直接运行print。
对比等待的情况:
import subprocess
child = subprocess.Popen(["ping","-c","5","www.google.com"])
child.wait()
print("parent process")
此外,你还可以在父进程中对子进程进行其它操作,比如我们上面例子中的child对象:
child.poll() # 检查子进程状态
child.kill() # 终止子进程
child.send_signal() # 向子进程发送信号
child.terminate() # 终止子进程
子进程的PID存储在child.pid
子进程的文本流控制
(沿用child子进程) 子进程的标准输入,标准输出和标准错误也可以通过如下属性表示:
child.stdin
child.stdout
child.stderr
我们可以在Popen()建立子进程的时候改变标准输入、标准输出和标准错误,并可以利用subprocess.PIPE将多个子进程的输入和输出连接在一起,构成管道(pipe):
import subprocess
child1 = subprocess.Popen(["ls","-l"], stdout=subprocess.PIPE)
child2 = subprocess.Popen(["wc"], stdin=child1.stdout,stdout=subprocess.PIPE)
out = child2.communicate()
print(out)
subprocess.PIPE实际上为文本流提供一个缓存区。child1的stdout将文本输出到缓存区,随后child2的stdin从该PIPE中将文本读取走。child2的输出文本也被存放在PIPE中,直到communicate()方法从PIPE中读取出PIPE中的文本。
要注意的是,communicate()是Popen对象的一个方法,该方法会阻塞父进程,直到子进程完成。
我们还可以利用communicate()方法来使用PIPE给子进程输入:
import subprocess
child = subprocess.Popen(["cat"], stdin=subprocess.PIPE)
child.communicate("vamei")
我们启动子进程之后,cat会等待输入,直到我们用communicate()输入"vamei"。
通过使用subprocess包,我们可以运行外部程序。这极大的拓展了Python的功能。如果你已经了解了操作系统的某些应用,你可以从Python中直接调用该应用(而不是完全依赖Python),并将应用的结果输出给Python,并让Python继续处理。shell的功能(比如利用文本流连接各个应用),就可以在Python中实现。
总结
subprocess.call, subprocess.check_call(), subprocess.check_output()
subprocess.Popen(), subprocess.PIPE
Popen.wait(), Popen.communicate()
python自动化开发例子_Python自动化开发从浅入深-语言基础(常用模块)相关推荐
- python自动化和教程_python自动化基本技术原理
python自动化测试(2) 自动化基本技术原理 1 概述 在之前的文章里面提到过:做自动化的首要本领就是要会 透过现象看本质 ,落实到实际的IT工作中就是 透过界面看数据. 掌握上面的这样的本领可不 ...
- python可以做网页开发么_Python可以开发网页吗?Python学习班
在很多人的印象中,Python是无所不能的,那么Python可以开发网页吗?有什么好用的框架呢?我们一起来看看吧. Python由荷兰数学和计算机科学研究学会的Guido van Rossum 于19 ...
- python开发职位_Python后端开发是什么职位?
陪伴而非守候 阶段一:Python开发基础Python全栈开发与人工智能之Python开发基础知识学习内容包括:Python基础语法.数据类型.字符编码.文件操作.函数.装饰器.迭代器.内置方法.常用 ...
- python中文开发环境_python中文开发环境
广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! python的开发工具有很多,除了python自带的idle,还有vim.pyc ...
- python自动办公知识点_Python自动化办公知识点整理汇总|简明python教程|python入门|python教程...
https://www.xin3721.com/eschool/pythonxin3721/ 知乎上有人提问:用python进行办公自动化都需要学习什么知识呢? 这可能是很多非IT职场人士面临的困 ...
- python自动化常用模块_Python自动化 【第五篇】:Python基础-常用模块
目录 模块介绍 time和datetime模块 random os sys shutil json和pickle shelve xml处理 yaml处理 configparser hashlib re ...
- python的运维开发课程_Python自动化运维开发实战课程方案
课程简介:? ? 随着信息时代的持续发展,IT运维已经成为IT服务内涵中重要的组成部分.面对越来越复杂的业务以及日趋多样化的用户需求,不断扩展的IT应用需要合理的IT运维保障IT服务灵活便捷.安全稳定 ...
- python自动化开发教程_Python自动化开发实战视频课程-全新基础篇_Python教程
s10 day1 开课前言- _* N, R+ w/ T 0001.51CTO学院-01 python s10 day2 上节回顾9 L/ S: x( ]9 u H 0001.51CTO学院-01 ...
- python自动化办公选择题_python自动化开发-[第一天]-练习题
1.使用while循环输入 1 2 3 4 5 6 8 9 10 i = 1 while i < 11: if i == 7: i += 1 continue print (i) i += 1 ...
最新文章
- NET::ERR_CACHE_MISS
- 电击、警棍、爆头,被骗去柬埔寨的程序员有多惨?
- Nboot中nand flash控制器参数TACLS、TWRPH0和TWRPH1的确定(基于K9F1208U0B)
- 移动測试技术保护源码!解码全球首款移动端白盒測试工具ThreadingTest (文章转自己主动点科技)...
- jvm最大内存限制多少?
- 打印用户在指定时间段内做过的SAP Fiori Launchpad personalization明细
- linux 安装程序丢失链接动态库,Linux安装软件过程中提示缺少动态链接库.so的解决方法...
- 链接聚合是将一组物理接口_500字描述华为VLAN聚合工作原理 你看懂了吗?
- JavaWeb调用python脚本(可传参)
- [leetcode]15. 三数之和
- BP神经网络学习总结
- 通过js操作jwplayer来播放暂停
- 注册表方法删除WINDOWS右键多余扩展项
- Python:忽如一夜春风来,千树万树梨花开
- 数据库驱动和数据库连接(MySQL)
- 重庆php就业前景,重庆就业前景最好的十大专业是哪些_中职中专网
- revit建模中两面墙贴在一起怎么插入门窗及隐框玻璃的做法
- 奥运五环图形 -《跟小海龟学Python》案例代码
- 还在删减文件?知乎百万人追捧的内存增加术,让你的内存秒翻倍
- Pytorch Random Erasing
热门文章
- linux红帽子怎么配置dhcp,LinuxDHCP的高级配置如何应用呢?
- tcpdump抓两个网卡的包_tcpdump 抓包统计 分享助,请问用tcpdump抓包后,如何查看每个包...
- QGraphicsWidget收不到鼠标、键盘消息解决
- 计算机四年级下册教案泰山版,泰山版信息技术四年级下册4、制作作息时间表教案设计...
- linux 内核 报错,根据epc定位linux内核报错.pdf
- ffmpeg for iOS,并调试iFrameExtractor demo
- CIKERS Shane 20190530
- SimpleDateFormat使用详解——日期、字符串应用
- pwd 查看”当前工作目录“的完整路径
- win8: 清除iframe的缓存