博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
我眼中的subprocess
阅读量:6708 次
发布时间:2019-06-25

本文共 1638 字,大约阅读时间需要 5 分钟。

最近打算写个”远程控制“小工具,”胖客户端“这边功能已经开发完毕了。试想一下这样的场景,你的笔记本电脑在图书馆正常的放着,然后你去了教学区上课去了。然后你想看一下自己电脑前有没有人,然后就可以通过手机发送一条命令,让笔记本电脑拍照,并发送给手机。或者你的同学在你的电脑边,然后你远程用手机发一条指令,让电脑发出鬼叫或者播放音乐什么的··· ···

但是遗憾的是这个”远程操作“功能成为了瓶颈,其实就是怎么让当前进程去执行额外命令。 还好遇到了subprocess。然后就可以很方便的”为所欲为“啦。


os模块

也许在subprocess之前,你可能听说过os模块。如:

import oscmdstr = "some cmd command"os.system(cmdstr)

这种方式可以很轻松的执行Windows上的命令,但是缺点是:

不受控,没有返回结果。对于简单的需求而言还行,但是对于需要获取返回结果的就不太适用了。

入门

相比较subprocess, 执行一条命令就方便多了。比如实现与os模块相同功能的话,可以使用如下代码:

import subprocesscmdstr = "some cmd command"subprocess.call(cmdstr)

当你想执行带有命令行参数的命令的时候,也是比较方便的。可以使用一个列表盛放需要执行的命令。subprocess底层会默认将这个列表拼装成命令字符串。

import subprocesscmdstr1 = 'ping'cmdstr2 = 'www.douban.com'subprocess.call([cmdstr1, cmdstr2])

除此之外,还有

- subprocess.check_call()

  • subprocess.check_out_put

等函数。按需选取就行了。

管道

熟悉命令行的同行肯定对于管道|不陌生了。工作在进程之间,为操作的提供了巨大的便利。尤其是linux爱好者,管道的魅力更甚。

当然了,windows上也是支持的,比方说,找出笔记本电脑上网卡网段为192.开头的信息。就可以这样办。

管道使用示例

同样,在subprocess中,PIPE的原理也是一样的。如果需要让管道起作用的话,Popen内相关参数要设置为PIPE即可。这一点可以参照文档,这里不再叙述。

进程交互

典型的场景就是,父进程内开启一个子进程,并获取子进程的执行的返回结果。

这个时候,就需要指定stdin, stdout为PIPE形式了。否则的话,两个进程之间是无法进行交流的。这就好比两个池塘,相互有自己的资源,如果内有一个通道的话,两个池塘就没办法”交流“。

1.py

import syss = "this is from {}".format(__file__)sys.stdout.write(s)

2.py

import subprocessimport systry:    child = subprocess.Popen('python ./1.py', stdout=subprocess.PIPE,stdin=subprocess.PIPE,stderr=subprocess.PIPE)    print child.stdout.readline()except Exception as e:    print e

运行结果

交互结果

如上,不难看出。父进程2.py最终得到了子进程1.py的运行结果的。

虽然这个很明显是单向的”交流“,但是已经满足博主的需求了。这就好比士兵对于命令的服从,给出指令,尽管执行便是,最后把结果反馈回来即可。

但是如果非要双向交流的话,那就得借助于communicate()方法了。

总结

本文简单的介绍了相关于subprocess模块的使用,比较通俗,也比较浅显。对于简单需求应该是够用的啦,但是非要深挖的话,还是得去看官方文档的好。

(^__^) 嘻嘻……

你可能感兴趣的文章
如何优雅地过滤敏感词
查看>>
我的Python成长之路—04
查看>>
Linux 大页内存的使用
查看>>
关于页面里插flash
查看>>
我的友情链接
查看>>
MySQL 修改索引名称
查看>>
RabbitMQ基础概念详细介绍
查看>>
《设计模式那点事》 - 书摘精要
查看>>
Yii-数据模型 自定义数据,数据库插入,修改方法
查看>>
献给初学者:谈谈如何学习Linux操作系统
查看>>
树莓派3学习笔记(6):常用的Linux命令
查看>>
Active Directory系列之用Veritas创建MSI文件
查看>>
"EXT QPI LINK 2" error的解决方法 IBM System x3850 X5shangxl@dc
查看>>
将表转javabean(基于mysql)
查看>>
IDEA下载激活配置
查看>>
vim配置文件
查看>>
Vuex从入门到精通(一)
查看>>
JAVA中int、String的类型转换
查看>>
bash及其特性
查看>>
CentOs6.5上安装MySQL-Cluster 7.3.4
查看>>