当我们运行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自动化开发从浅入深-语言基础(常用模块)相关推荐

  1. python自动化和教程_python自动化基本技术原理

    python自动化测试(2) 自动化基本技术原理 1 概述 在之前的文章里面提到过:做自动化的首要本领就是要会 透过现象看本质 ,落实到实际的IT工作中就是 透过界面看数据. 掌握上面的这样的本领可不 ...

  2. python可以做网页开发么_Python可以开发网页吗?Python学习班

    在很多人的印象中,Python是无所不能的,那么Python可以开发网页吗?有什么好用的框架呢?我们一起来看看吧. Python由荷兰数学和计算机科学研究学会的Guido van Rossum 于19 ...

  3. python开发职位_Python后端开发是什么职位?

    陪伴而非守候 阶段一:Python开发基础Python全栈开发与人工智能之Python开发基础知识学习内容包括:Python基础语法.数据类型.字符编码.文件操作.函数.装饰器.迭代器.内置方法.常用 ...

  4. python中文开发环境_python中文开发环境

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! python的开发工具有很多,除了python自带的idle,还有vim.pyc ...

  5. python自动办公知识点_Python自动化办公知识点整理汇总|简明python教程|python入门|python教程...

    https://www.xin3721.com/eschool/pythonxin3721/ 知乎上有人提问:用python进行办公自动化都需要学习什么知识呢? ​ 这可能是很多非IT职场人士面临的困 ...

  6. python自动化常用模块_Python自动化 【第五篇】:Python基础-常用模块

    目录 模块介绍 time和datetime模块 random os sys shutil json和pickle shelve xml处理 yaml处理 configparser hashlib re ...

  7. python的运维开发课程_Python自动化运维开发实战课程方案

    课程简介:? ? 随着信息时代的持续发展,IT运维已经成为IT服务内涵中重要的组成部分.面对越来越复杂的业务以及日趋多样化的用户需求,不断扩展的IT应用需要合理的IT运维保障IT服务灵活便捷.安全稳定 ...

  8. 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 ...

  9. 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 ...

最新文章

  1. NET::ERR_CACHE_MISS
  2. 电击、警棍、爆头,被骗去柬埔寨的程序员有多惨?
  3. Nboot中nand flash控制器参数TACLS、TWRPH0和TWRPH1的确定(基于K9F1208U0B)
  4. 移动測试技术保护源码!解码全球首款移动端白盒測试工具ThreadingTest (文章转自己主动点科技)...
  5. jvm最大内存限制多少?
  6. 打印用户在指定时间段内做过的SAP Fiori Launchpad personalization明细
  7. linux 安装程序丢失链接动态库,Linux安装软件过程中提示缺少动态链接库.so的解决方法...
  8. 链接聚合是将一组物理接口_500字描述华为VLAN聚合工作原理 你看懂了吗?
  9. JavaWeb调用python脚本(可传参)
  10. [leetcode]15. 三数之和
  11. BP神经网络学习总结
  12. 通过js操作jwplayer来播放暂停
  13. 注册表方法删除WINDOWS右键多余扩展项
  14. Python:忽如一夜春风来,千树万树梨花开
  15. 数据库驱动和数据库连接(MySQL)
  16. 重庆php就业前景,重庆就业前景最好的十大专业是哪些_中职中专网
  17. revit建模中两面墙贴在一起怎么插入门窗及隐框玻璃的做法
  18. 奥运五环图形 -《跟小海龟学Python》案例代码
  19. 还在删减文件?知乎百万人追捧的内存增加术,让你的内存秒翻倍
  20. Pytorch Random Erasing

热门文章

  1. linux红帽子怎么配置dhcp,LinuxDHCP的高级配置如何应用呢?
  2. tcpdump抓两个网卡的包_tcpdump 抓包统计 分享助,请问用tcpdump抓包后,如何查看每个包...
  3. QGraphicsWidget收不到鼠标、键盘消息解决
  4. 计算机四年级下册教案泰山版,泰山版信息技术四年级下册4、制作作息时间表教案设计...
  5. linux 内核 报错,根据epc定位linux内核报错.pdf
  6. ffmpeg for iOS,并调试iFrameExtractor demo
  7. CIKERS Shane 20190530
  8. SimpleDateFormat使用详解——日期、字符串应用
  9. pwd 查看”当前工作目录“的完整路径
  10. win8: 清除iframe的缓存