设为首页 收藏本站
查看: 1052|回复: 0

[经验分享] Python调用linux系统命令--使用subprocess模块

[复制链接]

尚未签到

发表于 2018-8-9 10:32:22 | 显示全部楼层 |阅读模式
  在python 中调用系统命令,如果使用subprocess.Popen() 模块,按照命令参数的的形式,可以分两种:

  •   把命令当作字符串传给subprocess.Popen()
  •   把命令保存到一个元组,list 的序列,再传给subprocess.Popen()
  subprocess模块使用Popen类创建子进程执行命令,首先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)
  参数说明:
  args:  被python执行的命令,一般使用字符串,或者序列(元组或者列表)的形式传入。如果args是一个元组或列表形式,序列的第一个元素就是命令的可执行文件。也可以使用executable 显式地指定可执行文件的路径。
  stdin, stdout, stderr :用于和外部进行通信。可以使用 subprcess.PIPE 进行初始化。当stdin, stdout, stderr 被初始化后,就可以和外部进行复杂的通信了。
  如:
  p = subprocess.Popen() 创建了子进程p 执行命令,外部需要给命令传入参数,则可以用p.communicate(stdin_some)方法,将stdin_some 传入p.stdin 标准输入。
  同时p.commucincate() 返回一个tuple 值 (stdout_some,  stderr_some) = p.communicate(stdin_some).所以,调用subprocess.Popen() 创建子进程执行命令,可以很方便地和子进程进行通信,获取状态。
  注意:如果需要使用communication() 方法与子进程通信,那么在创建子进程时,stdin, stdout, stderr, 都需要用subprocess.PIPE 初始化。
  shell : 默认是False, 如果args 的形式是字符串,那么shell=True, 指定命令是用shell 执行的。如果,args 的形式是一个元组或者list,那么shell=False, 指定不需要在shell 中执行命令。
  env : 字典, 用于指定子进程的运行环境,默认是None, 说明子进程继承父进程的环境变量。
  subprocess.Popen 的一些方法:
  Popen.communicate() :  与外部通信,(out, errout) = Popen.communicate(), 返回标准输出和错误输出。
  Popen.poll() : 检查子进程的状态,如果是None 则正在运行,如果是0 则退出,如果是-N 则异常退出。
  Popen.wait() : 等待进程结束,并获得返回码。
  Popen.pid  : 返回进程pid 号
  Popen.kill() : 杀死进程
  举例:
  1. 以字符串方式传入,shell=True:
DSC0000.png

  In [127] 行:创建Popen 对象,Popen 以子进程执行 'ls  -l  .' 命令,列出当前目录的文件,命令的执行结果在标准输出stdout, 因为stdout 用PIPE 初始化了,
  所以,在In [129] 行,用p.stdout.read() 将内容读出。
  2. 以序列的方式传入命令,shell=False:
DSC0001.png

  用序列的形式保存命令,就不需要指定shell=True 来运行指令了。指令的运行结果也保存在stdout 里,通过readlines() 方法将结果读出。
  3. 用communicate() 方法,与指令进行通信:
DSC0002.png

  'ls  -l' 命令的另一个参数路径名,通过communicat('/tmp') 传入,结果通过元组(outstd, outerr) 接收。
  4.  多条命令连通:
  在linux 下,经常使用管道将多条命令连在一起,前一条指令的执行结果作为后一条指令的输入,使用Popen 也可以实现。
DSC0003.png

  首先,查看test.txt 文件的内容。
  然后,子进程pb 的标准输入stdin 用pa.stdout 进行初始化,实现了管道的功能,pa 进程的输出编程了pb进程的输入,最后的输出结果。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-549045-1-1.html 上篇帖子: python_day13_CSS 下篇帖子: python 购物流程脚本
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表