用途:

在python中执行shell脚本


os.system

该函数返回命令执行结果的返回值,system()函数在执行过程中进行了以下三步操作: 
1.fork一个子进程; 
2.在子进程中调用exec函数去执行命令; 
3.在父进程中调用wait(阻塞)去等待子进程结束。 
对于fork失败,system()函数返回-1。

该命令返回值是脚本的退出状态码,只会有0(成功),1,2 
由于使用该函数经常会莫名其妙地出现错误,但是直接执行命令并没有问题,所以一般建议不要使用。


os.popen(cmd)

返回脚本执行的输出内容作为返回值

>>> md5_value = os.popen('md5sum /root/all.sql')    #将结果赋值给变量
>>> print(type(md5_value))                          #查看类型
<class 'os._wrap_close'>
>>> print(md5_value.read().split()[0])              #取值
7735d611ebce91ebb4c7acc4747a8b67

subprocess.Popen

subprocess.Popen(args, bufsize=0, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None,close_fds=False, shell=False, cwd=None, env=None, universal_newlines=False,startupinfo=None,creationflags=0)

创建并返回一个子进程,并在这个进程中执行指定的程序。

  实例化 Popen 可以通过许多参数详细定制子进程的环境,但是只有一个参数是必须的,即位置参数 args ,下面也会详细介绍剩余的具名参数。

参数介绍:

  • args:要执行的命令或可执行文件的路径。一个由字符串组成的序列(通常是列表),列表的第一个元素是可执行程序的路径,剩下的是传给这个程序的参数,如果没有要传给这个程序的参数,args 参数可以仅仅是一个字符串。
  • bufsize:控制 stdinstdoutstderr 等参数指定的文件的缓冲,和打开文件的 open()函数中的参数 bufsize 含义相同。
  • executable:如果这个参数不是 None,将替代参数 args 作为可执行程序;
  • stdin:指定子进程的标准输入;
  • stdout:指定子进程的标准输出;
  • stderr:指定子进程的标准错误输出;

  对于 stdin, stdout 和 stderr 而言,如果他们是 None(默认情况),那么子进程使用和父进程相同的标准流文件。

  父进程如果想要和子进程通过 communicate() 方法通信,对应的参数必须是 subprocess.PIPE(见下文例4);

  当然 stdin, stdout 和 stderr 也可以是已经打开的 file 对象,前提是以合理的方式打开,比如 stdin 对应的文件必须要可读等。 

  • preexec_fn:默认是None,否则必须是一个函数或者可调用对象,在子进程中首先执行这个函数,然后再去执行为子进程指定的程序或Shell。
  • close_fds:布尔型变量,为 True 时,在子进程执行前强制关闭所有除 stdin,stdout和stderr外的文件;
  • shell:布尔型变量,明确要求使用shell运行程序,与参数 executable 一同指定子进程运行在什么 Shell 中——如果executable=None 而 shell=True,则使用 /bin/sh 来执行 args 指定的程序;也就是说,Python首先起一个shell,再用这个shell来解释指定运行的命令。
  • cwd:代表路径的字符串,指定子进程运行的工作目录,要求这个目录必须存在;
  • env:字典,键和值都是为子进程定义环境变量的字符串;
  • universal_newline:布尔型变量,为 True 时,stdout 和 stderr 以通用换行(universal newline)模式打开,
  • startupinfo:见下一个参数;
  • creationfalgs:最后这两个参数是Windows中才有的参数,传递给Win32的CreateProcess API调用。

  同 Linux 中创建子进程类似,父进程创建完子进程后,并不会自动等待子进程执行,父进程在子进程之前推出将导致子进程成为孤儿进程,孤儿进程统一由 init 进程接管,负责其终止后的回收工作。

  如果父进程在子进程之后终止,但子进程终止时父进程没有进行最后的回收工作,子进程残留的数据结构称为僵尸进程。大量僵尸进程将耗费系统资源,因此父进程及时等待和回收子进程是必要的,除非能够确认自己比子进程先终止,从而将回收工作过渡给 init 进程。

  这个等待和回收子进程的操作就是wait()函数,下文中将会介绍。

>>> import subprocess
>>> p = subprocess.Popen('ls -l', shell=True)
>>> total 164
-rw-r--r--  1 root root   133 Jul  4 16:25 admin-openrc.sh
-rw-r--r--  1 root root   268 Jul 10 15:55 admin-openrc-v3.sh
...
>>> p.returncode
>>> p.wait()
0
>>> p.returncode
0

Popen创建的子进程有一些有用的属性,假设 p 是 Popen 创建的子进程,p 的属性包括:

p.pid: 子进程的PID

p.returncode

该属性表示子进程的返回状态,returncode可能有多重情况:

  • None —— 子进程尚未结束;
  • ==0 —— 子进程正常退出;
  • > 0—— 子进程异常退出,returncode对应于出错码;
  • < 0—— 子进程被信号杀掉了。

p.poll() 检查子进程  p 是否已经终止,返回 p.returncode 属性 
p.wait() 等待子进程 p 终止,返回 p.returncode 属性,wait() 立即阻塞父进程,直到子进程结束

p.communicate(input=None) 

和子进程 p 交流,将参数 input (字符串)中的数据发送到子进程的 stdin,同时从子进程的 stdout 和 stderr 读取数据,直到EOF

返回值:

  二元组 (stdoutdata, stderrdata) 分别表示从标准出和标准错误中读出的数据。

  父进程调用 p.communicate() 和子进程通信有以下限制:

  (1) 只能通过管道和子进程通信,也就是说,只有调用 Popen() 创建子进程的时候参数 stdin=subprocess.PIPE,才能通过 p.communicate(input) 向子进程的 stdin 发送数据;只有参数 stout 和 stderr 也都为 subprocess.PIPE ,才能通过p.communicate() 从子进程接收数据,否则接收到的二元组中,对应的位置是None。

  (2)父进程从子进程读到的数据缓存在内存中,因此commucate()不适合与子进程交换过大的数据。

  注意:

    communicate() 立即阻塞父进程,直到子进程结束!


p.terminate() 终止子进程 p ,等于向子进程发送 SIGTERM 信号;
p.kill()      杀死子进程 p ,等于向子进程发送 SIGKILL 信号;

subprocess.PIPE

调用本模块提供的若干函数时,作为 std* 参数的值,为标准流文件打开一个管道

import subprocess
child1 = subprocess.Popen(['ls', '-l'], stdout=subprocess.PIPE)
child2 = subprocess.Popen(['wc', '-l'], stdin=child1.stdout, stdout=subprocess.PIPE)
out = child2.communicate()
child1.wait()
child2.wait()
print(out)

将子进程 child1 的标准输出作为子进程 child2 的标准输入,父进程通过 communicate() 读取 child2 的标准输出后打印。

ref :link

link2

杀死 subprocess.Popen 的子子孙孙

[Python] os.poen和subprocess.popen相关推荐

  1. python执行系统命令的方法_python执行系统命令的方法 :os.system(),subprocess.popen(),command...

    最近接触到os.system(),subprocess.popen()和commands来执行系统命令,从网上搜索到许多,现整理如下. 1. 使用os.system("cmd") ...

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

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

  3. Python 技术篇-通过管道命令获取cmd执行的结果,获取os.system()、subprocess.Popen()执行命令返回的结果

    正常的 os.system() 执行完后只会返回个执行状态值,返回的 0 表示执行成功,1 表示执行失败. 如果想要获取到执行后的结果集,就需要用到管道命令 os.popen(),然后用 read() ...

  4. 【转】python os.popen 超时问题

    python 版本 2.5.4 (在高版本python中提倡使用 subprocess.Popen 取代 os.popen) os.popen 会出现过长时间等待导致阻塞问题, 解决方法如下: [py ...

  5. python os popen_【转】python os.popen 超时问题

    python 版本 2.5.4 (在高版本python中提倡使用 subprocess.Popen 取代 os.popen) os.popen 会出现过长时间等待导致阻塞问题, 解决方法如下: [py ...

  6. python subprocess popen 多次重定向_python subprocess.Popen系列问题

    最近在项目中遇到一个需求,前端发来一个命令,这个命令是去执行传递过来的一个脚本(shell 或者python),并返回脚本的标准输出和标准出错,如果执行超过设定时间还没结束就超时,然后终止脚本的执行. ...

  7. python popen阻塞_python subprocess.Popen系列问题

    最近在项目中遇到一个需求,前端发来一个命令,这个命令是去执行传递过来的一个脚本(shell 或者python),并返回脚本的标准输出和标准出错,如果执行超过设定时间还没结束就超时,然后终止脚本的执行. ...

  8. python中os.system、os.popen、subprocess.popen的区别

    最近项目中需要在python中执行shell脚本,以下解释使用os.system. os.popen和subprocess.popen的区别: 1.os.system 该函数返回命令执行结果的返回值, ...

  9. python os popen_python中的subprocess.Popen()使用详解

    从python2.4版本开始,可以用subprocess这个模块来产生子进程,并连接到子进程的标准输入/输出/错误中去,还可以得到子进程的返回值. subprocess意在替代其他几个老的模块或者函数 ...

最新文章

  1. 深度学习学习指南-工具篇
  2. Android测试原理概述(一)
  3. Error Code: 1175. You are using safe update mode and you tried to ......
  4. 2009岁末之复用系统框架(B/S)
  5. golang定时任务的使用
  6. 软考信息安全工程师备考笔记8:第八章应用系统安全工程备考要点
  7. PS去除图片和PDF中的水印
  8. 155页4万字智慧交通电子警察系统平台解决方案
  9. svn clean up 特别慢
  10. oracle中db_create_file_dest参数
  11. 教程|电脑PC微信多开
  12. mediasoup推拉流分析
  13. easyui datagrid deleteRow删除行时异常,删除了其他行
  14. 基于药效团模型和分子动力学模拟对PTP-LAR抑制剂的研究
  15. 图像一阶导数和二阶导
  16. Windows装逼操作
  17. 一文速学数模-降维模型(一)PCA(主成分分析法)原理以及应用+代码实现
  18. u盘无法格式化怎么办?数据丢失这样恢复
  19. register_chrdev_region、alloc_chrdev_region、register_chrdev区别
  20. 【宇麦科技】群晖NAS网络不通畅?跟着这篇教程来就对了!

热门文章

  1. java对excel文件的读写操作
  2. 如何写一份让自己和HR都想看的简历(社会招聘)
  3. 仿微信朋友圈根据图片数量不同而显示不同格式
  4. 一台服务器的可靠性能是,如何增强服务器内存的可靠性和可用性?
  5. springboot整合kafka3.1,实现基本配置和操作
  6. 盘点小米入局这5年,手机厂商的10位离任“霸道”总裁
  7. 运行chkdsk 修复 无法打开进行卷直接访问?
  8. 自己写个小工具——图片水印生成器
  9. 51单片机c语言tlc549,tlc549中文资料汇总_tlc549引脚图及功能_工作原理_特性参数及典型应用电路程序...
  10. 26.5th C/Linux短期班 一点分享与感受+部分爆照